-4

我们都知道,在 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 位的原始类型的基本原理是什么?而且,由于这肯定会对实践中的实施者产生严重影响,他们对此有何反应/处理?

(......或者我在阅读中错过了什么,也总是一个答案)

4

1 回答 1

1

您是正确的,所有 C 和 C++ 实现都必须提供至少 64 位的类型 - 但它不仅如此uint_least64_tint_least64_t而且迫使这一点。最小范围unsigned long long intlong long int需要 64 位。

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

于 2017-10-29T21:17:28.043 回答