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

标签 c memory

这个问题可能已经得到了回答,我不太确定如何措辞,但这里什么也没有。我正在 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/

相关文章:

c - 如何在不更改头文件的情况下更改函数返回的内容

c - 试验 SSL 连接

java - Java中对象的内存消耗

安卓内存测试

javascript - 需要部分 JavaScript 文件的内存使用情况

c - 将在短路评估中首先执行 (a&&b)

c - 如何使用 memcpy 在 C 中连接两个数组?

java - Scala 和进程中的内存泄漏

arrays - Go 如何保证元素指针对数组和 slice 有效?

c - 警告 : initialization from incompatible pointer type [-Wincompatible-pointer-types]