这可能已经被回答了,我不确定如何措辞,但是什么也没做。我正在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”更改为“ 1410065407” [-Woverflow] int b = 9999999999;
test.c:6:11:警告:从“ long int”到“ int”的转换溢出将值从“ 12345678912”更改为“ -539222976” [-Woverflow] int b = 12345678912;
仅输出十个整数:
〜/ Programming $ ./a.out 1234567891
答案 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所描述的行为才有可能。