我最初写这个是为了回答这个问题。虽然我已经对其进行了一些修改,但基本相同。
首先,可以使用宽于 32 位的普通整数,正如C++ 草案所说:
注意:普通整数旨在具有执行环境架构建议的自然大小;提供其他有符号整数类型以满足特殊需要。——尾注
强调我的
从表面上看,这似乎是说在我的 64 位架构(以及其他所有人的架构)上,一个普通的 int 应该有 64 位大小;这是架构建议的大小,对吗?但是我必须断言,即使 64 位架构的自然大小也是32 位。规范中的引用主要用于需要 16 位纯整数的情况——这是规范允许的最小大小。
最大的因素是约定,从具有 32 位普通 int 的 32 位架构开始,如果您将其保留为 32 位,则将源代码调整为 64 位架构会更容易,这对设计人员和他们的用户都有两种不同的方式:
首先是系统之间的差异越小,每个人就越容易。系统之间的差异只是让大多数程序员头疼的问题:它们只会使跨系统运行代码变得更加困难。它甚至会增加相对罕见的情况,即您无法在具有相同分布的仅 32 位和 64 位的计算机上执行此操作。然而,正如 John Kugelman 所指出的,架构已经从 16 位普通 int 变为 32 位普通 int,今天可以再次经历这样做的麻烦,这与他的下一点有关:
更重要的组成部分是它会导致整数大小或需要新类型的差距。因为sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long)
在实际规范中,如果将普通 int 移动到 64 位,则会强制出现间隙。它从 shift 开始long
。如果将普通 int 调整为 64 位,则sizeof(int) <= sizeof(long)
强制long
要求至少为 64 位的约束,并且从那里存在大小的内在差距。由于long
or 普通 int 通常用作 32 位整数,而现在它们都不能,我们只有一种数据类型可以,short
. 因为short
如果您简单地丢弃该大小,它至少有 16 位,它可能变成 32 位并理论上填补该空白,但是short
旨在针对空间进行优化,因此它应该保持这样的状态,也有用于小 16 位整数的用例。无论您如何安排尺寸,都会损失宽度,因此 int 的用例完全不可用。更大的宽度并不一定意味着它更好。
现在这意味着需要更改规格,但即使设计师失职,它也很可能会因更改而损坏或过时。持久系统的设计人员必须使用整个交织代码库,包括他们自己在系统中的代码、依赖项和他们想要运行的用户代码,并且在不考虑后果的情况下进行大量工作是不明智的.
附带说明一下,如果您的应用程序与 >32 位整数不兼容,您可以使用static_assert(sizeof(int) * CHAR_BIT <= 32, "Int wider than 32 bits!");
. 但是,谁知道规范可能会改变,64 位纯整数将被实现,所以如果你想成为未来的证明,不要做静态断言。