Ger*_*mia 2 c gcc sanitization bit-manipulation bitwise-operators
为什么-fsanitize=undefined
扔
运行时错误:左移1个31个位置无法在类型'int'中表示
在这个代码上
uint32_t z;
z = 1 << 31;
Run Code Online (Sandbox Code Playgroud)
?
使1无符号:
uint32_t z;
z = UINT32_C(1) << 31;
Run Code Online (Sandbox Code Playgroud)
因为左移 1 位 31 位不能用 type 表示int
。
在数学上,1 << 31
是 2 31,或2147483648
。INT_MAX
在典型系统上(其中int
是 32 位)比该值小 1,或2147483647
. 如果对有符号类型的算术运算溢出(产生超出类型结果的结果),则行为未定义。(不要假设它会环绕。它可能会,但语言并不能保证。)
如果您需要一种可以表示该值的类型,您可以使用至少 32 位宽的无符号类型,或超过 32 位宽的有符号类型。 unsigned long
或者long long
保证是那么宽。(该语言不保证int
超过 16 位宽,但在大多数系统上可能是 32 位。)
归档时间: |
|
查看次数: |
1515 次 |
最近记录: |