【问题标题】:Why does an int take up 4 bytes in c or any other language? [duplicate]为什么 int 在 c 或任何其他语言中占用 4 个字节? [复制]
【发布时间】:2018-05-12 10:28:47
【问题描述】:

这是一个普遍的问题,与 c 编程语言不完全相关,但这是我目前正在研究的内容。

为什么一个整数占用 4 个字节或多少字节取决于系统?

为什么每个整数不占用 1 个字节?

比如下面为什么要占8个字节:

int a = 1;
int b = 1;

谢谢

【问题讨论】:

  • 如果int a = 1;占用1个字节,那么a = 32535会做什么?
  • 因为int 具有支持的最小范围,如 C 标准中所述。并且大于1字节可以支持。
  • 因为编译器就是这么做的。 int 必须至少为 16 位,在您的情况下为 32。大小不适合特定的值范围。您可以选择最合适的类型。但不要吝啬,请使用int,除非您有充分的理由不这样做,例如嵌入式系统上的内存有限。
  • 你是在问为什么int 有一个特定的大小,或者为什么int 有一个固定大小而不是可变大小?
  • 是的。现在看看。我不应该在公共场合尝试心算。

标签: c int


【解决方案1】:

我不确定您是否在问为什么 int 对象具有固定大小而不是可变大小,或者您是否在问为什么 int 对象具有固定大小。这回答了前者。

我们不希望基本类型具有可变长度。这使得与他们合作变得非常复杂。

我们希望它们具有固定长度,因为这样更容易生成对它们进行操作的指令。此外,操作会更快。

如果int 的大小是可变的,请考虑这样做时会发生什么:

b = 3;
b += 100000;
scanf("%d", &b);

第一次分配b 时,只需要一个字节。然后,当执行加法时,编译器需要更多空间。但是b 可能在内存中有邻居,所以编译器不能只是将它增长到适当的位置。它必须释放旧内存并在某处分配新内存。

然后,当我们执行scanf 时,编译器不知道有多少数据即将到来。 scanf 将不得不做一些非常复杂的工作来一次又一次地增长b,因为它读取更多的数字。而且,完成后,它如何让您知道新的b 在哪里?编译器必须有一些机制来更新b 的位置。这既困难又复杂,并且会导致其他问题。

相比之下,如果b 有四个字节的固定大小,这很容易。对于作业,请将 3 写入b。对于加法,将b 中的值加100000 并将结果写入b。对于scanf,将b 的地址传递给scanf,让它将新值写入b。这很容易。

【讨论】:

    【解决方案2】:

    基本整数类型int保证至少有16位;至少意味着编译器/架构也可以提供更多位,并且在 32/64 位系统上int 很可能分别包含 32 位或 64 位(即 4 字节或 8 字节)(例如,参见@987654321 @):

    整数类型

    ... int(也可以作为signed int访问):这是最优化的 平台的整数类型,并且保证至少为 16 位。大多数当前系统使用 32 位(请参阅下面的数据模型)。​​

    如果您想要一个正好为 8 位的整数类型,请使用 int8_tuint8_t

    【讨论】:

      【解决方案3】:

      它没有。它是实现定义的。例如,在 Atmel 8 位微控制器上的 gcc 中的 signed int 是一个 16 位整数。 unsigned int 也是 16 位,但从 0 到 65535,因为它是无符号的。

      【讨论】:

        【解决方案4】:

        int 使用固定字节数(例如 4)的事实是编译器/CPU 效率和限制,旨在使常见的整数运算快速高效。

        有些类型(例如 Java 中的 BigInteger)占用的空间量是可变的。这些类型将有 2 个字段,第一个是用于表示整数的单词数,第二个是单词数组。您可以定义自己的 VarInt 类型,例如:

        struct VarInt {
            char length;
            char bytes[]; // Variable length
        }
        
        VarInt one = {1, {1}};          // 2 bytes
        VarInt v257 = {2, {1,1}};       // 3 bytes
        VarInt v65537 = {4, {1,0,0,1}}; // 5 bytes
        

        等等,但这不会很快执行算术。您必须决定如何处理溢出;调整存储大小需要动态内存分配。

        【讨论】:

        • 这不是 Java 问题。
        • @WeatherVane 是的,但这是一个“或任何其他语言”问题。我确实说过“比如”。
        • 是的,我错过了,但这个答案更多的是关于 Java 的能力,而不是 C。
        猜你喜欢
        • 1970-01-01
        • 2010-09-20
        • 1970-01-01
        • 2020-06-03
        • 1970-01-01
        • 2011-07-20
        • 1970-01-01
        • 1970-01-01
        • 2014-11-20
        相关资源
        最近更新 更多