0

我想知道,在 C/C++ 中通常可用的所有数据类型中,为什么其中一些依赖于操作系统或编译器?

这有什么合乎逻辑的原因,还是只是设计使然?

4

3 回答 3

3

是的。因为 C/C++ 在许多不同的机器架构上运行。

所以int被定义为机器的“自然大小” - 这让编译器生成在该机器上运行良好的代码。

在现代机器上,通常是 32 位或 64 位。在旧机器上,它是 16 位。在某些机器上(你可以查一下)它是 24 位或 36 位的。

C 标准对这些类型的定义非常谨慎。它需要一些东西(例如“long不能小于int”),而将其他东西留给实现。

于 2012-12-13T20:10:42.277 回答
0

int在这方面并不特别。每个整数数据类型都依赖于编译器。每种类型都有最小范围,并且类型具有非递减大小的顺序:char-> short-> int-> long-> long long。符合要求的实现可以使它们全部为 64 位宽。

于 2012-12-13T20:50:25.753 回答
-1

int类型应该是您正在使用的体系结构的自然大小。所以在 32 位机器上,int通常是 32 位。在 64 位上,int通常是 64 位。(64 位机器上的 32 位操作系统可能是 32 位int。)

这样做的原因是效率。通常,最大可表示数量实际上并不重要,您只想使用最有效的类型。最常见的例子是循环。

for(int i=0; i< NUM_ITER; ++i) {
  // ...
}

对于大多数循环,迭代次数通常不会那么大。但是,即使您知道您不需要循环超过 255 次,使用,例如,unsigned char因为您的循环计数器在寄存器使用等方面实际上可能效率较低。

编辑:这是另一个例子。假设字长为 4 个字节,并且您有一些以如下方式开头的函数:

void foo() {
  static char x;
  static char y;
  // ...
}

一个天真的编译可能会将变量x放在某个地址,比如0x0F00. 然后变量y将由天真的编译放置在地址处,0x0F01因为x只需要 1 个字节。但是在许多架构上,内存访问针对 4 字节对齐的地址进行了优化,因此访问y可能被实现为对/从 4 字节的访问0x0F00,然后丢弃其中的 3 个字节。这在带宽消耗方面显然是浪费的,但更大的问题是必须进行额外的处理才能将 4 字节字中的字节打包/解包。

OTOH,如果大于 1 字节是可以的(即,如果您不依赖变量溢出作为算法的一部分),那么您最好将它们声明x为. 即使您的值 <256,您最终每次都访问 4 个字节,这很浪费,但不比前一种情况更多。但是,您不再需要对变量进行打包或解包,这样就没有了一些开销。yint

关键是,如果您简单地将xand声明yint,则不必担心 32 位体系结构与 64 位体系结构的对齐问题。无论哪种方式,编译器都会做正确的事情。

于 2012-12-13T20:12:33.507 回答