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

C++ 为什么int在64位编译器上通常是32位的?,c++,compiler-construction,int,sizeof,platform,C++,Compiler Construction,Int,Sizeof,Platform,为什么int在64位编译器上通常是32位的?当我开始编程时,我被教导int通常与底层架构的宽度相同。我同意这也是有道理的,我发现一个未指定宽度的整数与底层平台一样宽是合乎逻辑的(除非我们讨论的是8位或16位的机器,在这里,int的如此小的范围几乎不适用) 后来我了解到,在大多数64位平台上,int通常是32位的。所以我想知道这是什么原因。对于存储数据,我更喜欢显式指定的数据类型宽度,因此这就留下了int的通用用法,它不提供任何性能优势,至少在我的系统上,我对32位和64位整数具有相同的性能。因此

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


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

int
s在大多数主要体系结构上已经是32位了,因此将它们更改为64位可能会导致比它解决的问题更多的问题。

因为使用64位整数对许多软件没有好处

使用64位整数来计算可以用32位整数计算的东西(在许多情况下,高达40亿(或+/-2十亿)的值就足够了),而将它们变大也不会有任何帮助

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

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

编辑:
有趣的是,当微软移动到64位时,他们甚至没有将
long
64位,因为它会破坏太多依赖
long
作为32位值的东西(或者更重要的是,他们有一大堆东西依赖于
long
作为API中的32位值,有时客户端软件使用
int
,有时使用
long
,他们不希望这种情况发生。).

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

实施者的错误选择

严格地说,根据标准,“普通INT具有 执行架构建议的自然大小 “环境”,这意味着64位上的64位
int
你可以很容易地说,其他任何东西都是 不一致。但在实践中,问题更为复杂: 不允许从32位
int
切换到64位
int
大多数程序都可以处理大型数据集或任何东西(与 从16位切换到32位);大多数程序可能是 受到其他因素的限制。这将增加 数据集的大小,从而减少局部性并降低速度 程序关闭

最后(可能也是最重要的),如果
int
是64位,
short
必须为16位或 32位,您将无法指定另一位(除了 使用
中的typedef,目的是 应仅在非常特殊的情况下使用)。
我怀疑这是主要的动机。

因为还没有人指出这一点

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


int
可以是任何类型,只要它提供了标准要求的最小范围。

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

历史、权衡和决策由开放组在解释。它涵盖了各种数据模型、它们的优缺点以及为适应64位计算而对Unix规范所做的更改。

我最初写这篇文章是为了回应。虽然我对它做了一些修改,但主要是sa我

首先,可以使用大于32位的纯整数,如下所示:

 注:普通整数旨在具有执行环境的体系结构建议的自然大小;提供其他有符号整数类型是为了满足特殊需要- 尾注

重点矿山

在我的64位体系结构(以及其他所有人的体系结构)上,这表面上似乎是这么说的普通整数应该有64位大小;这是体系结构建议的大小,对吗?但是我必须声明,即使64位体系结构的自然大小也是32位。规范中的引用主要针对需要16位普通整数的情况——这是规范允许的最小大小

最大的因素是惯例,从32位体系结构到32位纯整数,如果将源代码保留为32位,那么将其改编为64位体系结构就简单多了,对于设计师和他们的用户来说,这两个dif都是32位的