int main()
{
int a = 2147483647;
int c = a + a + 2;
printf("2a + 2 = %d, !(2a + 2) = %d, !c = %d\n", (2 * a + 2), !(a + a + 2), !c);
}
我运行上面的代码时得到了这个
2a+2=0!(2a+2)=0!c=1
a是Tmax,二进制形式为0111...所以a+a+2被假定为0000...0
int main()
{
int a = 2147483647;
int c = a + a + 2;
printf("2a + 2 = %d, !(2a + 2) = %d, !c = %d\n", (2 * a + 2), !(a + a + 2), !c);
}
我运行上面的代码时得到了这个
2a+2=0!(2a+2)=0!c=1
a是Tmax,二进制形式为0111...所以a+a+2被假定为0000...0
假设int
是32位,您正在执行的操作会导致有符号整数溢出.这样做会触发undefined behavior.它有not个必要的环绕.
事实上,在C standard的第3.4.3p3节中,这一特定情况作为未定义行为的示例给出,其中定义了术语undefined behavior:
未定义行为的一个示例是整数溢出行为
您遇到了一种未定义的行为可以表现出来的奇怪方式,即看似相同的操作表现不同.未定义的行为意味着无法保证程序将做什么.