为什么会-fsanitize=undefined
扔
运行时错误:不能以“int”类型表示 1 到 31 个位置的左移
在这段代码上
uint32_t z;
z = 1 << 31;
?
为什么会-fsanitize=undefined
扔
运行时错误:不能以“int”类型表示 1 到 31 个位置的左移
在这段代码上
uint32_t z;
z = 1 << 31;
?
使 1 无符号:
uint32_t z;
z = UINT32_C(1) << 31;
因为不能在 type 中表示 1 乘 31 位的左移int
。
在数学上,1 << 31
是 2 31或2147483648
。INT_MAX
在一个典型的系统(其中int
32 位)上是比那个小一,或者2147483647
. 如果对有符号类型的算术运算溢出(产生类型结果之外的结果),则行为未定义。(不要假设它会环绕。它可能会,但语言并不能保证它。)
如果您需要一种可以表示该值的类型,则可以使用至少 32 位宽的无符号类型,或超过 32 位宽的有符号类型。 unsigned long
或者long long
保证是那么宽。(该语言不保证int
超过 16 位宽,但在大多数系统上可能是 32 位。)