这个问题可能已经得到了回答,我不太确定如何措辞,但这里什么也没有。我正在 Linux 上使用 gcc 进行编译。我的问题是,为什么当我将十个 9 分配给 int 变量时,编译器会抛出溢出警告,但当我分配使用十位数字的值“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: warning: overflow in conversion from ‘long int’ to ‘int’ changes value from ‘9999999999’ to ‘1410065407’ [-Woverflow] int b = 9999999999;
test.c:6:11: warning: overflow in conversion from ‘long int’ to ‘int’ changes value from ‘12345678912’ to ‘-539222976’ [-Woverflow] int b = 12345678912;
仅输出十个整数:
~/Programming$ ./a.out 1234567891
最佳答案
它与以 10 为基数的“位数”无关,或者,如果您愿意的话,也与您写出数字时的数字长度(同样以 10 为基数)无关。限制的最基本原因是计算机以位和字节的形式存储数字(以及其他所有内容),这意味着它们以 2 为基数工作。
c 中的 int
是 4 字节(32 位)数据类型。如果 int
有符号或 0,它可以存储 -2,147,483,648 (-231) 到 2,147,483,647 (231 - 1) 范围内的数字如果不是,则为 4,294,967,295 (232-1)。
无论哪种方式,1234567891 都在 4 个字节的范围内,但 9999999999 和 12345678912 则不在范围内。
<小时/>注意:我知道规范允许 int
为 2 个字节,但只有当 OP 使用包含 int
的实现时,OP 描述的行为才有可能是 4 个字节。
关于c - 为什么 int 可以容纳 10 位数字,但不能容纳另一个整数的 9 位数字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54614332/