【发布时间】:2019-10-09 23:29:58
【问题描述】:
当我发现这个奇怪时,我一直在玩按位运算和二进制补码。
#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
为什么会这样?
【问题讨论】:
-
你溢出了,所以它会导致未定义的行为。使用
unsigned int。 -
您在第二行
printf上缺少)。 -
@MooingDuck 我知道溢出,我只是感到困惑,因为第一个 printf 的输出似乎表明 tmin + tmin 为 0,但显然不是?
-
@DonThousand:程序有未定义的行为,所以任何事情都可能发生。
-
C 标准没有说
int类型中存在溢出的一个特定结果。它说,只要有int溢出,C 实现就可以做它想做的任何事情,而且每次都可以不同。正如其他人指出但未解释的那样,这称为未定义行为,这意味着 C 标准根本不强加任何要求。在您询问的情况下,C 编译器可能只是在做“最简单”的事情。例如,编译器可以获取包含溢出的整个表达式并将其减少为 0,而不管它包含什么。
标签: c gcc twos-complement