C 如果我们在最大可表示整数上加一,结果是负数吗?
此程序要求C 如果我们在最大可表示整数上加一,结果是负数吗?,c,operators,integer-overflow,signed-integer,C,Operators,Integer Overflow,Signed Integer,此程序要求C实现回答一个简单的问题: 如果我们检查最大可表示整数INT\u MAX
C
实现回答一个简单的问题:
如果我们检查最大可表示整数INT\u MAX<0,并将其打印出来
printf ("%d\n", (INT_MAX) < 0);
并显示输出1
为什么条件不变为假
另外,如果我们在最大的可再现整数上加一,结果是负数吗
如果我们在最大可表示整数上加一,结果是负数吗
否。无符号整数溢出。你可以观察到,好像它在2的补语表示中缠绕。但这只是特定于实现的行为,C标准绝对不能保证任何事情。
INT\u MAX
作为有符号值,INT\u MAX+1
会导致有符号整数溢出,从而调用
包含UB的(ny)程序的输出(如果有)无法以任何方式进行调整。未定义
INT\u MAX+1
的行为,因为您将溢出有符号的类型
程序可以输出任何东西,或者编译器可以吃掉你的猫
(出于兴趣,这就是为什么您会将-INT_MAX-1
视为2的补码系统上INT_MIN
的定义。)INT_MAX=0x7fffff
INT_MAX+1=0x8000000=-2147483648<0
谢谢你解决了我的问题。我认为这一定是溢出。@Bathsheba好的,这很混乱,让我把那部分放在外面。我在回答中断言这一定是溢出。欢迎你抄袭——你的答案通常比我的更全面。还有一卡车UB.Hmmm第13个答案,包括“吃你的猫”。希望你的小猫图标不会因为这些事情而紧张。@chux-Ha。是的,我想我说了很多。一只三叉戟猫应该加倍紧张。
#include <limits.h>
#include <stdio.h>
int main (void)
{
printf ("%d\n", (INT_MAX+1) < 0);
return 0;
}
INT_MAX = 0x7fffffff
INT_MAX + 1 = 0x80000000 = -2147483648 < 0