如果我们将最大的可表示整数加一,结果是否为负数?

If we add one to the largest re-presentable integer, is the result negative?

此程序要求 C 实现回答一个简单的问题:

如果我们检查最大可重现整数 INT_MAX < 0 并打印它。

printf ("%d\n", (INT_MAX) < 0);

因此,显示输出 0。因为条件变为 false 和关系运算符 return 0.

但是,如果我们 add 1 到最大的可表示整数并检查条件,请参见以下程序。

#include <limits.h>
#include <stdio.h>

int main (void)
{
  printf ("%d\n", (INT_MAX+1) < 0);
  return 0;
}

并显示 输出 1

为什么条件没有变成false?

另外,如果我们对最大可表示整数加一,结果是否为负数?

If we add one to the largest re-presentable integer, is the result negative?

没有。有符号整数溢出是 undefined behaviour。您可能会观察到它好像环绕在 2 的补码表示中。但这只是特定于实现的行为,C 标准绝对不提供任何此类保证。

INT_MAX 是有符号值,INT_MAX + 1 导致有符号整数溢出,从而调用 undefined behavior.

包含 UB 的(纽约)程序的输出(如果有的话)无法以任何方式证明是正确的。

INT_MAX + 1 的行为是 未定义,因为您将溢出 signed 类型。

程序可以输出任何东西,否则编译器会吃掉你的猫。

(出于兴趣,这就是为什么您会在 2 的补码系统中看到 -INT_MAX - 1 作为 INT_MIN 的定义。)

INT_MAX = 0x7fffffff
INT_MAX + 1 = 0x80000000 = -2147483648 < 0