37

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

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

4

8 回答 8

15

实施者的错误选择?

说真的,根据标准,“普通整数具有执行环境架构所建议的自然大小”,这确实意味着int64 位机器上的 64 位。人们很容易争辩说其他任何东西都是不合格的。但在实践中,问题更复杂:从 32 位切换int到 64 位int不允许大多数程序处理大型数据集或其他任何东西(与从 16 位切换到 32 位不同);大多数程序可能受到其他考虑的限制。它会增加数据集的大小,从而降低局部性并减慢程序速度。

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

于 2013-07-05T13:36:31.303 回答
13

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

于 2013-12-03T18:52:04.907 回答
4

ints 在大多数主要架构上一直是 32 位,以至于将它们更改为 64 位可能会导致比它解决的问题更多的问题。

于 2013-07-05T13:21:34.083 回答
4

因为对于很多软件来说,拥有 64 位整数并没有什么优势。

使用 64 位 int 来计算可以用 32 位整数计算的东西(对于许多目的,高达 40 亿(或 +/- 2 亿)的值就足够了),并且使它们更大不会有任何帮助。

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

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

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

于 2013-07-05T13:24:42.660 回答
2

我最初写这个是为了回答这个问题。虽然我已经对其进行了一些修改,但基本相同。

首先,可以使用宽于 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 位的约束,并且从那里存在大小的内在差距。由于longor 普通 int 通常用作 32 位整数,而现在它们都不能,我们只有一种数据类型可以,short. 因为short如果您简单地丢弃该大小,它至少有 16 位,它可能变成 32 位并理论上填补该空白,但是short旨在针对空间进行优化,因此它应该保持这样的状态,也有用于小 16 位整数的用例。无论您如何安排尺寸,都会损失宽度,因此 int 的用例完全不可用。更大的宽度并不一定意味着它更好。

现在这意味着需要更改规格,但即使设计师失职,它也很可能会因更改而损坏或过时。持久系统的设计人员必须使用整个交织代码库,包括他们自己在系统中的代码、依赖项和他们想要运行的用户代码,并且在不考虑后果的情况下进行大量工作是不明智的.

附带说明一下,如果您的应用程序与 >32 位整数不兼容,您可以使用static_assert(sizeof(int) * CHAR_BIT <= 32, "Int wider than 32 bits!");. 但是,谁知道规范可能改变,64 位纯整数将被实现,所以如果你想成为未来的证明,不要做静态断言。

于 2019-08-02T15:57:51.263 回答
1

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

于 2013-07-05T13:35:12.093 回答
0

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

于 2013-07-05T13:39:48.073 回答
-1

因为还没有人指出这一点。

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

int允许是任何东西,只要它提供标准要求的最小范围。

于 2013-07-05T13:38:23.177 回答