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,或 2147483648
。 INT_MAX
在一个典型的系统上(其中 int
是 32 位)比那个少一位,或者 2147483647
。如果对有符号类型的算术运算溢出(产生超出类型结果的结果),则行为未定义。 (不要假设它会环绕。它可能会,但语言并不能保证它。)
如果您需要可以表示该值的类型,您可以使用至少 32 位宽的无符号类型,或超过 32 位宽的有符号类型。 unsigned long
或 long long
保证有那么宽。 (该语言不保证 int
的宽度超过 16 位,但在大多数系统上很可能是 32 位。)
为什么-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,或 2147483648
。 INT_MAX
在一个典型的系统上(其中 int
是 32 位)比那个少一位,或者 2147483647
。如果对有符号类型的算术运算溢出(产生超出类型结果的结果),则行为未定义。 (不要假设它会环绕。它可能会,但语言并不能保证它。)
如果您需要可以表示该值的类型,您可以使用至少 32 位宽的无符号类型,或超过 32 位宽的有符号类型。 unsigned long
或 long long
保证有那么宽。 (该语言不保证 int
的宽度超过 16 位,但在大多数系统上很可能是 32 位。)