为什么gcc无法正确添加tmin + tmin?

问题描述 投票:0回答:1

当我发现这种奇怪之处时,我一直在研究按位运算和二进制补码。

#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

为什么会这样?

c gcc twos-complement
1个回答
0
投票

[0x80000000以二进制形式是

0b10000000000000000000000000000000

[将两个0x80000000加在一起时,

    |<-          32bits          ->|
  0b10000000000000000000000000000000
+ 0b10000000000000000000000000000000
------------------------------------
 0b100000000000000000000000000000000
    |<-          32bits          ->|

但是,您计算机上的int似乎只有32位,因此仅保留了低32位,这意味着结果中的1被静默丢弃。这称为Integer Overflow

还请注意,在C中,有符号(而不是无符号,即unsigned int)整数溢出实际上是undefined behavior

© www.soinside.com 2019 - 2024. All rights reserved.