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

1 << 31 cannot be represented by type 'int'?

为什么-fsanitize=undefined抛出

runtime error: left shift of 1 by 31 places cannot be represented in type 'int'

关于此代码

uint32_t z;
z = 1 << 31;

?

使 1 无符号:

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

因为1左移31位无法用int类型表示。

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

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