2

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

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

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

所以,显示输出0。因为条件变为false并且关系运算符返回0

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

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

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

并显示输出 1

为什么条件不会变为

另外,如果我们将最大的可再现整数加一,结果是否为负?

4

4 回答 4

7

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

没有。有符号整数溢出是未定义的行为。您可能会观察到它好像以 2 的补码表示形式环绕。但这只是特定于实现的行为,C 标准绝对没有这样的保证。

于 2016-08-24T07:31:50.457 回答
5

INT_MAX作为有符号值,INT_MAX + 1会导致有符号整数溢出,这会调用未定义的行为

包含 UB 的(ny)程序的输出(如果有的话)不能以任何方式证明。

于 2016-08-24T07:32:11.717 回答
5

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

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

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

于 2016-08-24T07:32:20.433 回答
-1
INT_MAX = 0x7fffffff
INT_MAX + 1 = 0x80000000 = -2147483648 < 0
于 2016-08-24T07:35:34.693 回答