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