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

时间:2018-11-30 22:56:37

标签: c gcc bit-manipulation bitwise-operators sanitization

为什么-fsanitize=undefined会抛出

  

运行时错误:“ int”类型不能表示左移1位31位。

使用此代码

uint32_t z;
z = 1 << 31;

2 个答案:

答案 0 :(得分:5)

使1个未签名:

uint32_t z;
z = UINT32_C(1) << 31;

答案 1 :(得分:4)

因为不能以int类型表示左移1 31个位置。

从数学上讲,1 << 31是2 31 2147483648INT_MAX在典型系统(int是32位)上is one less than that, or 2147483647`。如果对有符号类型的算术运算溢出(产生的结果超出该类型的结果),则该行为未定义。 (不要以为它会环绕。可能会,但是语言并不能保证它。)

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