C 中的怪事:非零不等于一

weird thing in C: not zero is not equal to one

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...111,所以 a + a + 2 应该是 0000...0000。 我不明白为什么 !(2a + 2) 不等于 1,而 (2a + 2) 实际上是 0,而 !c 是 1!!! 请帮助我

假设 int 是 32 位,您正在执行的操作会导致有符号整数溢出。这样做会触发 undefined behavior。它 不一定 环绕。

事实上,此特定情况在 C standard 的第 3.4.3p3 节中作为未定义行为的示例给出,其中定义了术语 未定义行为

An example of undefined behavior is the behavior on integer overflow

您遇到过未定义行为表现出来的一种奇怪方式,看似相同的操作却表现不同。未定义的行为意味着无法保证您的程序将执行的操作。