为何对uint16_t执行移位操作的结果类型是int?
问题:为何
uint16_t >> uint16_t的结果类型是int? 我在编写C++模板代码时,遇到了uint16_t >> uint16_t的运算场景,但编译器推导得出结果类型是int。示例代码如下:
#include <cstdint> template<class Type> struct S; void foo() { S<decltype(uint16_t(1) >> uint16_t(1))>(); }
使用x86-64 gcc 10.3编译器时,报错信息如下:
<source>: In function 'void foo()': <source>:4:45: error: invalid use of incomplete type 'struct S<int>' 4 | S<decltype(uint16_t(1) >> uint16_t(1))>(); |
请问为何uint16_t(1) >> uint16_t(1)的结果类型是int?
解答
这是C++标准中整数提升规则导致的结果:
- 在C++的算术运算中,所有尺寸小于
int的整数类型(包括uint16_t这类16位无符号整数类型),会先被提升为int或unsigned int再参与运算。 - 对于
uint16_t来说,它的取值范围是0到65535,而通常int是32位类型,完全可以容纳uint16_t的所有取值,所以编译器会将uint16_t操作数提升为int类型。 - 当两个被提升为
int的操作数进行右移运算后,运算结果的类型自然是int,这就导致decltype推导出来的类型是int,而非uint16_t。
内容的提问来源于stack exchange,提问作者XuanInsr
相关产品推荐
相关产品推荐

