0

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

#include <stdio.h>
int main(){
  int x;
  scanf("%d",&x);
  printf("%d\n",x);
}

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

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

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

4

3 回答 3

3

通过 C99 标准 6.5 表达式:

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

看这里:

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

http://ideone.com/07THjV

void main()

顺便main返回int

于 2013-10-21T10:28:48.073 回答
1

2147483647 即 INT_MAX 的表示是0x7FFFFFFF.
如果你加 1,你会得到一个未定义的行为
这就是说,在实践中,如果你加 1,你会得到0x80000000即 -2147483648。
我不知道你为什么期望 -1 因为它的二进制编码是0xFFFFFFFF.

#include <stdio.h>
#include <errno.h>

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=2147483647scanf将值限制在可能的范围内。
如果你errnoscanf调用后检查,你会看到它等于ERANGE(代码 34)

于 2013-10-21T10:34:55.450 回答
0

您可以读取十六进制的输入并获得正确的输出

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

于 2013-10-21T11:13:02.403 回答