1 << 31不能用'int'类型表示?

Ger*_*mia 2 c gcc sanitization bit-manipulation bitwise-operators

为什么-fsanitize=undefined

运行时错误:左移1个31个位置无法在类型'int'中表示

在这个代码上

uint32_t z;
z = 1 << 31;
Run Code Online (Sandbox Code Playgroud)

Ger*_*mia 5

使1无符号:

uint32_t z;
z = UINT32_C(1) << 31;
Run Code Online (Sandbox Code Playgroud)

  • 这不能保证工作。`1u` 是 `unsigned int` 类型,不能保证比 16 位更宽。你说你需要投射它,但你没有投射它。你可以做`unsigned uint32_t z = (uint32_t)1 &lt;&lt; 31;` (2认同)

Kei*_*son 5

因为左移 1 位 31 位不能用 type 表示int

在数学上,1 << 31是 2 31,或2147483648INT_MAX在典型系统上(其中int是 32 位)比该值小 1,或2147483647. 如果对有符号类型的算术运算溢出(产生超出类型结果的结果),则行为未定义。(不要假设它会环绕。它可能会,但语言并不能保证。)

如果您需要一种可以表示该值的类型,您可以使用至少 32 位宽的无符号类型,或超过 32 位宽的有符号类型。 unsigned long或者long long保证是那么宽。(该语言不保证int超过 16 位宽,但在大多数系统上可能是 32 位。)