十六进制溢出但变量不溢出

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,但不会产生错误。