如果我输入一个等于INTMax + 1的数字,计算机不会返回-1

int类型的长度是4个字节,我在Ubuntu下用C编写了一个小程序来打印我刚刚输入的数字。 当我输入2147483648,即2 ^ 31时,它打印2147483647而不是-1。 当我输入任何大于2147483647的数字时,会发生同样的事情。为什么它不会溢出到-1,因为我学习了表格书,但似乎被截断为INT_Max并且在比特级别发生了什么?

#include  int main(){ int x; scanf("%d",&x); printf("%d\n",x); } 

我犯了一个错误。 INT_Max + 1应等于INT_Min。 我修改了代码:

 #include  int main(){ int x=2147483647; int y=x+1; printf("%d",y); } 

输出是-2147483648现在我只是想知道当我调用函数scanf时发生了什么? 我认为它将所有大于2147483647的输入数字截断为2147483647。

2147483647的表示即INT_MAX是0x7FFFFFFF
如果添加1,您将获得未定义的行为
这说,实际上,如果你加1,你将获得0x80000000即-2147483648。
我不知道你为什么期望-1,因为它的二进制编码是0xFFFFFFFF

 #include  #include  int main(){ int val1 = 2147483647; int val2 = val1+1; int x; printf("errno before : %d\n",errno); scanf("%d",&x); //enter 2147483648 or a larger value printf("errno after : %d\n\n",errno); printf("val1 = %d (0x%X)\n", val1, val1); printf("val2 = %d (0x%X)\n", val2, val2); printf("x = %d (0x%X)\n", x, x); return 0; } 

输出:

 errno before : 0 errno after : 34 //0 if the entered value is in the range of 4-bytes integer val1 = 2147483647 (0x7FFFFFFF) val2 = -2147483648 (0x80000000) x = 2147483647 (0x7FFFFFFF) 

得到x=2147483647的原因是scanf将值钳位到可能的范围。
如果在scanf调用后检查errno ,您将看到它等于ERANGE (代码34)

按C99标准6.5表达式:

如果在计算表达式期间发生exception情况(即,如果结果未在数学上定义或未其类型的可表示范围内 ),则行为未定义

看这里:

 int i = 2147483648; printf("%d",i); 

http://ideone.com/07THjV

 void main() 

顺便说一下main返回int

您可以读取hex输入并获得正确的输出

 int main(void) { int a; printf("\nEnter number :"); scanf("%X",&a); printf("\n\n%d\n\n",a); return 0; } 

输入值:80000000
输出将是:-2147483648
或者你可以像这样使用

 printf("\nEnter number :"); scanf("%u",&a); 

输入值:2147483648
输出将是:-2147483648