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

时间:2013-07-05 13:17:28

标签: c++ compiler-construction int sizeof platform

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

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

8 个答案:

答案 0 :(得分:12)

实施者方面选择不好?

严重的是,根据标准,“平原有了 执行体系结构建议的自然大小 环境“,这意味着64位上的64位int 机。人们可以轻易地争论其他任何事情 不符合的。但在实践中,问题更复杂: 从32位int切换到64位int允许 大多数程序来处理大型数据集或其他任何东西(不像 从16位切换到32位;大多数程序都可能 受到其他考虑的限制。它会增加 数据集的大小,从而减少局部性和减慢 程序下来。

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

答案 1 :(得分:6)

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

答案 2 :(得分:5)

大多数主要架构上的

int已经长达32位,将它们更改为64位可能会导致比它解决的问题更多的问题。

答案 3 :(得分:2)

因为很多软件没有64位整数的优势。

使用64位int来计算可以用32位整数计算的东西(并且出于多种目的,最多40亿(或+/- 2亿)的值就足够了),并且将它们变大不会帮忙。

但是,使用更大的整数会对处理器缓存中“大小”整数的整数数量产生负面影响。因此,使它们变大会使涉及大量整数(例如数组)的计算花费更长时间,因为。

int是机器字的自然大小,不是C ++标准规定的。在大多数16或32位机器的时代,将它制成16位或32位是有意义的,因为这对于那些机器来说是非常有效的尺寸。说到64位机器,它不再“有帮助”。所以保持32位int更有意义。

编辑: 有趣的是,当Microsoft迁移到64位时,他们甚至没有使long 64位,因为它会破坏太多依赖long为32位值的东西(或更重要的是,他们有很多依赖于long在他们的API中是32位值的东西,有时客户端软件使用int,有时使用long,他们不希望这样打破)。

答案 4 :(得分:1)

主要原因是向后兼容性。此外,已有64位整数类型long,浮点类型也是如此:floatdouble。为不同的体系结构更改这些基本类型的大小只会带来复杂性。此外,32位整数在范围方面响应了许多需求。

答案 5 :(得分:1)

我最初是为了回应this question而写的。我已经对其进行了一些修改,但基本上是相同的。

要开始使用,可以使用大于32位的纯整数,如C++ draft所述:

  

注意:普通整数旨在具有执行环境的体系结构建议的自然大小;提供其他有符号整数类型以满足特殊需要。 —笔记

强调我的

表面上看来这似乎表明,在我的64位体系结构(以及其他所有人的体系结构)上,普通int应该具有64位大小;这是体系结构建议的大小,对吗?但是,我必须断言,即使是64位架构自然的大小也是32位。规范中的报价主要用于需要16位纯整数的情况,这是规范允许的最小大小。

最大的因素是约定俗成,从具有32位纯整数的32位体系结构开始,如果将其源代码保留为32位,那么对于设计人员和他们的用户来说,将其源代码更改为64位体系结构将更加容易方式:

首先,每个系统之间的差异越小,每个人的难度就越大。系统之间的差异只是大多数程序员的头疼:它们只会使跨系统运行代码变得更加困难。它甚至会添加到相对罕见的情况下,即您无法在32位和64位相同分布的计算机上执行此操作。但是,正如约翰·库格曼(John Kugelman)所指出的那样,架构已经从16位变为32位普通int,今天麻烦可以再做一次,这与他的下一个观点有关:

更重要的部分是它将导致整数尺寸或需要新类型的差距。因为sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long)在实际规范中,所以如果将普通int移至64位,则会强制使用间隙。它从移动long开始。如果将普通int调整为64位,则sizeof(int) <= sizeof(long)将强制long至少为64位的约束,从那里开始在大小上存在固有的差距。由于long或普通int通常用作32位整数,并且现在都不可用,因此我们只有一种可以使用的数据类型short。因为short的最小长度为16位(如果您简单地放弃该大小,则可能变为32位并在理论上填补了这一空白),但是short旨在针对空间进行优化,因此应该 ,还有 用例适用于小的16位整数。无论您如何安排尺寸,都会损失宽度,因此,完全不可用的int用例。较大的宽度并不一定意味着会更好。

这现在意味着需要更改规格,但是即使设计师无赖,很可能会因更改而损坏或过时。持久系统的设计人员必须处理整个系统中相互纠缠的代码,包括他们自己想要运行的系统代码,依赖项和用户代码,而这样做的大量工作却不考虑后果,这是不明智的

请注意,如果您的应用程序与> 32位整数不兼容,则可以使用static_assert(sizeof(int) * CHAR_BIT <= 32, "Int wider than 32 bits!");。但是,谁知道规范将会发生变化,并且将实现64位纯整数,因此,如果您想成为将来的证明,请不要执行静态断言。

答案 6 :(得分:0)

因为没有人指出这一点。

int保证在 -32767到32767之间( 2^16)这是标准所要求的。如果您想在所有平台上支持64位数字,我建议使用支持的正确类型long long -9223372036854775807至9223372036854775807 )。

只要提供标准所要求的最小范围,

int就可以是任何东西。

答案 7 :(得分:0)

C + +标准没有说明应该为int类型使用多少内存,告诉你应该至少为int类型使用多少内存。在许多32位指针变量的编程环境中,“int”和“long”都是32位长。