当我发现这种奇怪之处时,我一直在研究按位运算和二进制补码。
#include <stdio.h>
int main ()
{
int tmin = 0x80000000;
printf("tmin + tmin: 0x%x\n", tmin + tmin);
printf("!(tmin + tmin): 0x%x\n", !(tmin + tmin));
}
上面的代码导致以下输出
tmin + tmin: 0x0
!(tmin + tmin): 0x0
为什么会这样?
[0x80000000
以二进制形式是
0b10000000000000000000000000000000
[将两个0x80000000
加在一起时,
|<- 32bits ->|
0b10000000000000000000000000000000
+ 0b10000000000000000000000000000000
------------------------------------
0b100000000000000000000000000000000
|<- 32bits ->|
但是,您计算机上的int
似乎只有32位,因此仅保留了低32位,这意味着结果中的1
被静默丢弃。这称为Integer Overflow。
还请注意,在C中,有符号(而不是无符号,即unsigned int
)整数溢出实际上是undefined behavior。