为什么一个int可以容纳10位数字,但不能处理另一个整数的9位数字?

时间:2019-02-10 07:33:44

标签: c memory

这可能已经被回答了,我不确定如何措辞,但是什么也没做。我正在Linux上使用 gcc 进行编译。我的问题是,当我为int变量分配10个9时,为什么编译器会抛出溢出警告,而当我分配使用十位数字的值“ 1234567891”时,编译器不会抛出溢出警告。如果我将值分配为“ 12345678912”,则将这样做。

#include <stdio.h>

int main(void)
{
    int a = 1234567891;
    int b = 9999999999;

    printf("%d, %d\n", a, b);

    return 0;
}
  

test.c:6:11:警告:从“ long int”到“ int”的转换中的溢出将值从“ 9999999999”更改为“ 141006540​​7” [-Woverflow]     int b = 9999999999;

     

test.c:6:11:警告:从“ long int”到“ int”的转换溢出将值从“ 12345678912”更改为“ -539222976” [-Woverflow]     int b = 12345678912;

仅输出十个整数:

  

〜/ Programming $ ./a.out   1234567891

1 个答案:

答案 0 :(得分:1)

它与以10为底的“位”数无关,也与(如果您愿意)写出来时的数字长度无关(同样以10为底)。限制的最基本原因是计算机以位和字节的形式存储数字(以及其他所有内容),这意味着它们以2为基数工作。

c中的int是4字节(32位)数据类型。如果int是带符号的,则可以存储-2,147,483,648(-2 31 )到2,147,483,647(2 31 -1)范围内的数字,或者0到4,294,967,295( 2 32 -1)。

无论哪种方式,1234567891都可以容纳4个字节,但是9999999999和12345678912都不可以。


注意:我知道规范允许int为2个字节,但是只有OP使用int为4个字节的实现时,OP所描述的行为才有可能。