为什么int在64位编译器上通常是32位?

31 c++ compiler-construction int platform sizeof

为什么int64位编译器通常是32位?当我开始编程时,我被教过int通常与底层架构的宽度相同.我同意这也是有道理的,我发现未指定的宽度整数与底层平台一样宽是合乎逻辑的(除非我们说的是8或16位机器,这样的小范围int几乎不适用).

后来我int在大多数64位平台上学到的通常是32位.所以我想知道这是什么原因.对于存储数据,我更喜欢明确指定数据类型的宽度,因此这留下了通用用法int,这不会提供任何性能优势,至少在我的系统上我对32位和64位整数具有相同的性能.这样就留下了二进制内存占用空间,虽然不是很多,但会略有减少.

Jam*_*nze 12

实现者的选择不好?

说真的,根据标准,"Plain ints具有执行环境架构所建议的自然大小",这意味着int64位机器上的64位.人们可以轻易地争辩说其他任何事情都是不符合要求的.但在实践中,这些问题更为复杂:开关从32位int到64位int不会允许大多数程序来处理大量的数据集或任何(不同于从16位到32中的开关); 大多数程序可能受到其他考虑因素的限制.它会增加数据集的大小,从而减少局部性并减慢程序速度.

最后(也可能是最重要的),如果int是64位, short则必须是16位或32位,并且你无法指定另一个(除了typedef in <stdint.h>,并且意图是这些应该只在非常特殊的情况下使用).我怀疑这是主要动机.

  • 很容易争辩说“执行环境的体系结构建议的自然大小”可能意味着 32 位,因为这通常会导致比替代方案更好的性能。 (2认同)

Phi*_*l P 7

The Open Group在http://www.unix.org/whitepapers/64bit.html上解释了历史,权衡和决策.它涵盖了各种数据模型,它们的优点和缺点以及对Unix规范所做的更改,以适应64位计算.


dor*_*ron 5

int在大多数主要架构中,s已经长达32位,将它们更改为64位可能会导致比它解决的问题更多的问题.

  • 什么样的问题?我经历了`int`从16位到32位的迁移,它没有引起任何问题.我没有看到将`int`从32位更改为64会导致任何问题. (2认同)
  • @James是真的,直到程序员明确假设int是32位.很多代码都适用于这个假设. (2认同)

Mat*_*son 5

因为很多软件拥有 64 位整数并没有什么优势。

使用 64 位 int 来计算可以用 32 位整数计算的东西(对于许多用途,高达 40 亿(或 +/- 2 十亿)的值就足够了),并且使它们更大无济于事。

然而,使用更大的整数会对处理器缓存中适合多少整数大小的“事物”产生负面影响。因此,使它们更大将使涉及大量整数(例如数组)的计算花费更长的时间,因为。

int是机器字的自然大小是不是规定由C ++标准。在大多数机器都是 16 位或 32 位的时代,将其设为 16 位或 32 位是有意义的,因为这对于这些机器来说是非常有效的大小。当涉及到 64 位机器时,这不再“有帮助”。因此,使用 32 位int更有意义。

编辑:有趣的是,当微软转向 64 位时,他们甚至没有制造long64 位,因为它会破坏太多依赖于long32 位值的东西(或者更重要的是,他们有一堆东西依赖于long在他们的 API 中使用 32 位值,有时客户端软件使用int,有时使用long,他们不想破坏)。

  • 从技术上讲,微软的界面从来没有“长”。他们确实有“DWORD”,毫无疑问是 32 位。但是有很多代码错误地假定“long==DWORD==32 位”。 (2认同)