为什么-fsanitize=undefined
会抛出
运行时错误:“ int”类型不能表示左移1位31位。
使用此代码
uint32_t z;
z = 1 << 31;
?
答案 0 :(得分:5)
使1个未签名:
uint32_t z;
z = UINT32_C(1) << 31;
答案 1 :(得分:4)
因为不能以int
类型表示左移1 31个位置。
从数学上讲,1 << 31
是2 31 或2147483648
。 INT_MAX
在典型系统(int
是32位)上is one less than that, or
2147483647`。如果对有符号类型的算术运算溢出(产生的结果超出该类型的结果),则该行为未定义。 (不要以为它会环绕。可能会,但是语言并不能保证它。)
如果您需要一种可以表示该值的类型,则可以使用至少32位宽的无符号类型,或超过32位宽的有符号类型。 unsigned long
或long long
可以保证那么宽。 (该语言不能保证int
的宽度超过16位,但在大多数系统上可能为32位。)