代码之家  ›  专栏  ›  技术社区  ›  ajq88

为什么在某些编译器中int的大小不同?[副本]

  •  1
  • ajq88  · 技术社区  · 10 年前

    读取以下资源时,它表示int/指针的大小可能因编译器而异:

    http://www.c4learn.com/c-programming/c-size-of-pointer-variable/

    这是为什么?

    我理解C只定义了一个类型应该保存的最小和最大数量,但是为什么一个编译器会选择将例如int设置为2字节,另一个设置为4字节?一个比另一个有什么优势?

    2 回复  |  直到 10 年前
        1
  •  6
  •   Mats Petersson    10 年前

    虽然“为什么”可以用“因为标准这么说”来回答,但人们可以提出这样的论点,即标准可以用不同的写法来保证特定的大小。

    然而,C和C++的目的是在所有机器上生成非常快的代码。如果编译器必须确保 int 对于那台机器来说是“不自然的尺寸”,它需要额外的指令。在几乎所有的情况下,这都是不需要的,你所关心的只是它“足够大,足以满足我想要做的事情”。因此,为了给编译器一个生成“好代码”的好机会,标准只规定了最小的大小,避免了编译器必须生成“额外代码” 整数 (和其他类型)的行为方式非常特殊。

    C和C++的众多优点之一是,编译器可以针对范围广泛的机器,从小型8位和16位微控制器到大型64位多核处理器,如PC中的处理器。当然,也有一些18、24或36位机器。如果您的机器具有36位的原生大小,如果因为某些标准这么说,由于额外的指令,您在整数运算中的性能只有一半,并且不能使用 整数 ...

    一个带有8位寄存器的小型微处理器通常支持16位加法和减法(也可能包括乘法和除法),但32位数学将涉及对这些指令进行加倍运算[以及更多的乘法和除法运算]。因此,16位整数(2字节)在这么小的处理器上更有意义——特别是因为内存可能也不是很大,所以为每个整数存储4字节有点浪费。在32位或64位机器中,内存范围很可能要大得多,因此拥有更大的整数并不是什么缺点,32位整数运算的速度与较小的整数运算相同(在某些情况下“更好”-例如,在x86中,16位简单的数学运算(如加法或减法)需要额外的前缀字节来表示“使这个16位”,因此16位整数运算将占用更多的代码空间)。

        2
  •  1
  •   ouah    10 年前

    因为C标准规定:

    (C99,6.2.5p5)“一个“普通”int对象具有执行环境体系结构所建议的自然大小”

    C仅定义最大值的最小值 int ( INT_MAX )可以保持最小值的最大值 整数 可以容纳( INT_MIN ).