5

我正在为 STM32Fx cortex-M3 系列处理器开发程序。在 stdint.h 中定义了以下内容:

typedef unsigned int uint_fast32_t;
typedef uint32_t  uint_least32_t;
typedef unsigned long uint32_t;

据我了解。

[u]int_fast[n]_t will give you the fastest data type of at least n bits.
[u]int_least[n]_t will give you the smallest data type of at least n bits.
[u]int[n]_t will give you the data type of exactly n bits.

另外据我所知 sizeof(unsigned int) <= sizeof(unsigned long) 和 UINT_MAX <= ULONG_MAX - 总是。

因此,我希望 uint_fast32_t 是一种大小等于或大于 uint32_t 大小的数据类型。

在 cortex-M3 的情况下,sizeof(unsigned int) == sizeof(unsigned long) == 4。所以上述定义在大小方面是“正确的”。

但是为什么它们没有以与底层数据类型的名称和逻辑大小一致的方式定义,即

typedef unsigned long uint_fast32_t;
typedef unsigned int  uint_least32_t;
typedef uint_fast32_t uint32_t;

有人可以澄清基础类型的选择吗?

鉴于 'long' 和 'int' 的大小相同,为什么不对所有三个定义使用相同的数据类型呢?

typedef unsigned int uint_fast32_t;
typedef unsigned int uint_least32_t;
typedef unsigned int uint32_t;
4

2 回答 2

3

情况是,只能保证

sizeof(long) >= sizeof(int)

并且不能保证它实际上不再是。在很多系统上,int 通常和 long 一样大。

于 2012-07-08T08:35:04.350 回答
2

请参阅我对您其他问题的回答

基本上,使用哪种类型并不重要。鉴于intlong具有相同的大小并具有相同的表示形式和其他特征,实现者可以为int32_tint_fast32_t和选择任何一种类型,int_least32_t对于相应的无符号版本也是如此。

(特定选择可能会受到感知需要的影响,即对于intand具有不同大小的实现使用相同的标头long,但我不知道您引用的特定定义将如何实现这一点。)

只要类型大小合适并满足标准规定的所有其他要求,并且只要您不编写依赖于例如int32_t与 兼容int或与兼容的代码long,就没有关系。

做出的特定选择可能是实施者的任意心血来潮——这是完全可以接受的。或者,这个头文件可能是由两个或多个对哪种类型最好有不同想法的开发人员修改的。

于 2012-07-29T02:00:07.203 回答