为什么*_leastN_t和*_fastN_t类型是必需的,而不是可选的

Why are the *_leastN_t and *_fastN_t types required, not optional?

本文关键字:fastN 类型 为什么 leastN      更新时间:2023-10-16

我们都知道,C99的stdint.h中定义的精确宽度整数typedef是可选的,只有当体系结构具有这些宽度、符号等的基元类型时才能定义。

然而,我刚刚意识到[u]int_(fast|least)N_t不是可选的,而是必需的。参见ISO/IEC 9899:9999,第7.18.1节:

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

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

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

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