【问题标题】:Why are the *_leastN_t and *_fastN_t types required, not optional?为什么 *_leastN_t 和 *_fastN_t 类型是必需的,而不是可选的?
【发布时间】: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 我没有问相反的问题,因为我知道答案,这是显而易见的。

标签: c++ c99 stdint cstdint


【解决方案1】:

您是正确的,所有 C 和 C++ 实现都必须提供至少 64 位的类型 - 但不只是 uint_least64_tint_least64_t 强制这样做。 unsigned long long intlong long int 的最小范围也需要 64 位。

为什么标准委员会认为需要 64 位类型是值得的?很难说,但可能是因为大多数架构都有一个可用的,而那些没有的可以通过库函数来实现它(如果不使用它们就不会被链接)。

【讨论】:

  • 这是一个我还没有想到的好点。那么,我想真正的问题是为什么long long ints 的要求最低。也许这会为我的搜索提供更好的燃料。我还认为我在过于基本的层面上考虑了原始类型的性质,因为需要相应的硬件寄存器,而编译器当然可以根据需要实际实现它们。
  • long 已经需要至少 32 位,因此 long long 只有在更长的情况下才值得。实际上,这意味着 64 位。 long 已经有 20 或 30 年的时间不足以容纳磁盘大小和大文件了。
猜你喜欢
  • 2016-11-08
  • 2012-10-17
  • 1970-01-01
  • 1970-01-01
  • 2022-08-20
  • 2014-10-05
  • 1970-01-01
  • 1970-01-01
  • 2021-11-08
相关资源
最近更新 更多