4

为什么会-fsanitize=undefined

运行时错误:不能以“int”类型表示 1 到 31 个位置的左移

在这段代码上

uint32_t z;
z = 1 << 31;

?

4

2 回答 2

9

使 1 无符号:

uint32_t z;
z = UINT32_C(1) << 31;
于 2018-11-30T22:59:01.720 回答
5

因为不能在 type 中表示 1 乘 31 位的左移int

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

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

于 2018-12-01T02:36:53.967 回答