Is there a currently used system with a C++ compiler where int is over 32 bits wide?

ruo*_*ola 27 c++ size int system bit

C++ standard says only that int has to be at least 16 bits wide. And at least according to cppreference, it's almost always either 16 or 32 bits wide:

data model       int width in bits
----------------------------------
C++ standard     at least 16
LP32             16
ILP32            32
LLP64            32
LP64             32
Run Code Online (Sandbox Code Playgroud)

...

Other models are very rare. For example, ILP64 (8/8/8: int, long, and pointer are 64-bit) only appeared in some early 64-bit Unix systems (e.g. Unicos on Cray).


Is there an example of a currently used system with a C++ compiler where int is over 32 bits wide? By currently used I mean e.g. some old system maybe still actively used by a specific industry because there's a valid reason to use it for that specific task and which cannot reasonably be replaced with something else. Preferably this would be something that's actively being developed/worked on, and not just a system running legacy code, which hasn't been touched in 20 years. A modern system with for example 64 bit int, which is used for scientific computing would also be an excellent answer.

我不是要在90年代使用2年然后完全丢弃的系统。我也不是在寻找只用作玩耍的爱好的东西,或一些旧系统,这是世界上两家公司之所以使用它们,仅仅是因为它们太便宜而无法升级。

Dav*_*ald 13

请注意,此答案旨在解决框架挑战;即使有64个操作系统,由于几点原因,通常也不会希望> 32位。这意味着在没有考虑这些要点的情况下,团队不太可能会花时间去创建操作系统,甚至在这一点上已经过时的可能性也很小。我希望找到更直接的答案,但是我认为这至少可以证明主要操作系统的决定是正确的。

首先,您是正确的,C ++草稿允许使用允许大于32位的普通整数。报价:

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

重点矿

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

约定是一个强大的因素,如果从32位体系结构和32位Plain Int转换为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或int用作32位整数,并且现在都不可以使用它们,因此我们只有一个可以使用的数据类型short。因为short如果至少丢弃该大小,则至少有16位,因此它可能变为32位并填补该空白。但是short打算针对空间进行优化,因此应该保持这种状态,并且还有一些小的16位整数的用例。无论您如何安排尺寸,都会损失宽度,因此,完全不可用的int用例。

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

另外,如果您的应用与32位整数不兼容,则可以使用static_assert(sizeof(int) * CHAR_BIT <= 32, "Int wider than 32 bits!");。但是,谁知道规范可能更改,并且会实现64位的int整数,因此,如果您想成为将来的证明,请不要执行静态声明。

  • 我不确定我是否赞成将32位整数转换为64位整数是不值得的头疼问题。从16位整数到32位整数是一个巨大的瓶颈,但是确实做到了。不,我对为什么整数从未增长到64位的回忆是,它会在C类型系统中留下空白。您将有16位短裤和64位整数,中间没有整数类型。您将如何制作32位整数?避免这种情况导致了我们今天的情况,即int不再是64位系统上的“自然字长”。 (8认同)