如果我们将一个加到最大的可重现整数,那么结果是否定的?

msc*_*msc 2 c operators integer-overflow signed-integer

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

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

printf ("%d\n", (INT_MAX) < 0);
Run Code Online (Sandbox Code Playgroud)

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

但是,如果我们添加 1到最大的可重现的整数和检查条件,请参阅以下程序.

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

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

并显示输出 1.

为什么条件不会变

另外,如果我们将一个加到最大的可重现整数,那么结果是否定的?

usr*_*usr 7

如果我们将一个加到最大的可重现整数,那么结果是否定的?

否.有符号整数溢出是未定义的行为.您可能会观察到它在2的补码表示中包裹起来.但这只是实现特定的行为,C标准绝对没有任何保证.


Sou*_*osh 5

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

包含UB的(ny)程序的输出(如果有的话)无法以任何方式证明.


Bat*_*eba 5

的行为INT_MAX + 1不确定的,你会溢出一个signed类型.

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

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