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



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

#include <stdio.h>
int main(void)
{
    int a = 1234567891;
    int b = 9999999999;
    printf("%d, %dn", 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;

仅输出十个整数:

~/编程$ ./a.out 1234567891

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

c 中的int是 4 字节(32 位(数据类型。如果int已签名,它可以存储 -2,147,483,648 (-231( 到 2,147,483,647 (231 - 1( 范围内的数字,如果没有签名,则可以存储 0 到 4,294,967,295 (232-1( 范围内的数字。

无论哪种方式,1234567891都在适合 4 个字节的范围内,但 9999999999 和 12345678912 不是。


注意:我承认规范允许int为 2 个字节,但 OP 描述的行为仅在 OP 使用int为 4 字节的实现时才有可能。

相关内容

最新更新