如果我们将最大的可表示整数加一,结果是否为负数?
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
此程序要求 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