我最初是为了回答
这个问题而写的。虽然我进行了一些修改,但大部分内容仍然相同。
首先,可以拥有比32位更宽的普通整数,正如
C++草案所说:
引用:
注意:普通整数的自然大小应该符合执行环境的体系结构建议;其他有符号整数类型是为了满足特殊需要而提供的。——结束语
重点在于“自然大小”,这似乎表明在我的64位体系结构(以及其他人的)上,普通整数应该具有64位大小。这是体系结构建议的大小,对吧?但是我必须强调,即使对于64位体系结构,“自然”大小也是32位。规范中的引用主要适用于需要16位普通整数的情况——这是规范允许的最小大小。
最大的因素是约定俗成,从32位体系结构到32位普通整数并将该源代码适配到64位体系结构只需保持32位即可,这对于设计人员和两种不同方式的用户都更加简单:
首先,系统之间差异越小,对于每个人来说就越容易。系统之间的差异对于大多数程序员而言只会带来麻烦:它们只会使跨系统运行代码变得更加困难。即使在相同分发的计算机上,32位和64位之间也会增加相对罕见的无法运行的情况。然而,正如John Kugelman所指出的那样,体系结构已经从16位到32位普通整数,今天再次进行这样的操作是可行的,这与他的下一个观点有关:
更重要的组成部分是它会在整数大小上造成差异或需要新类型。因为
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位普通int,因此,如果要具有未来功能,请勿执行静态断言。