You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何对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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 12:48:19