【发布时间】:2017-10-29 21:06:23
【问题描述】:
我们都知道,在 C99 的 stdint.h 中定义的精确宽度整数类型定义是可选的,仅当架构具有这些宽度、符号等的原始类型时才定义。
不过,我现在才意识到[u]int_(fast|least)N_t 不是可选的,而是必需的。参见 ISO/IEC 9899:9999,第 7.18.1 节:
[7.18.1.2] 3需要以下类型:
int_least8_t int_least16_t int_least32_t int_least64_t uint_least8_t uint_least16_t uint_least32_t uint_least64_t
[7.18.1.3] 3需要以下类型:
int_fast8_t int_fast16_t int_fast32_t int_fast64_t uint_fast8_t uint_fast16_t uint_fast32_t uint_fast64_t
因此,如前所述,所有能够提供符合标准的 C 或 C++ 编译器的架构——包括独立的编译器,在这些架构中都需要 stdint.h——必须能够提供至少 64 位的原始类型!
鉴于标准在许多其他实现细节上的余地,这对我来说似乎很奇怪。这尤其是因为显然我们自 1999 年以来一直在执行它,在 64 位计算甚至在桌面上成为主流之前的几年。更不用说在许多情况下仍然是最新的嵌入式架构之间的滞后。
要求所有实现都具有至少 64 位的原始类型的基本原理是什么?而且,由于这肯定会对实践中的实施者产生严重影响,他们对此有何反应/处理?
(......或者我在阅读中错过的东西,总是一个答案)
【问题讨论】:
-
所有的
least类型都可以被一些基本类型满足,因为基本类型的可表示值的范围至少要求long long int至少有64 位。因此,您的问题可以简化为为什么long long int在 C 中是一个东西。 -
问题应该是反过来的:为什么固定大小的类型是可选的?答案是它们可能不存在,所以它们不是必需的。可以在所有符合标准的编译器上实现快速和最少的变体。
-
另外,要求 64 位整数对于实现者来说并不是一个“严重”的问题。在大多数系统都有 16 位处理器的时代,
long必须至少是 32 位,并且实现者提供了 32 位数学的软件实现来支持它。 -
“64 位计算”中的“64”是指指针大小,而不是可用的整数算术大小。 64 位整数更常见。
-
有趣的点,谢谢! @PeteBecker 我没有问相反的问题,因为我知道答案,这是显而易见的。