十六进制溢出但变量不溢出
Overflow with hexadecimal but not with variable
我在拿按位运算开玩笑,我注意到
int y = 0x7fffffff;
printf("%x",-~y);
打印
80000000
但如果我这样做
printf("%x",-~0x7fffffff);
它给我一个溢出错误:
main.c:65:17: error: integer overflow in expression [-Werror=overflow]
printf("%x",-~0x7fffffff);
有谁知道为什么 -~y
没有相同的行为?
-~y
确实有同样的问题,编译器只是不会静态检测它,因此不会警告您。直接使用整型字面量时,编译器在编译时进行计算,意识到存在溢出。
这是因为编译器试图否定 0x80000000
,这在 32 位中是无法完成的。虽然此类故障会在运行时导致 UB,但不会产生错误。
我在拿按位运算开玩笑,我注意到
int y = 0x7fffffff;
printf("%x",-~y);
打印
80000000
但如果我这样做
printf("%x",-~0x7fffffff);
它给我一个溢出错误:
main.c:65:17: error: integer overflow in expression [-Werror=overflow]
printf("%x",-~0x7fffffff);
有谁知道为什么 -~y
没有相同的行为?
-~y
确实有同样的问题,编译器只是不会静态检测它,因此不会警告您。直接使用整型字面量时,编译器在编译时进行计算,意识到存在溢出。
这是因为编译器试图否定 0x80000000
,这在 32 位中是无法完成的。虽然此类故障会在运行时导致 UB,但不会产生错误。