ARM cortex-M3 uint_fast32_t vs uint32_t

时间:2012-07-08 08:29:44

标签: c types sizeof primitive-types cortex-m3

我正在为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;

2 个答案:

答案 0 :(得分:3)

案例是,只保证

sizeof(long) >= sizeof(int)

并不保证它实际上已经存在了。在很多系统上,int通常都很长。

答案 1 :(得分:2)

请参阅我对your other question的回答。

基本上,使用哪种类型并不重要。鉴于intlong大小相同且具有相同的表示和其他特征,实施者可以为int32_tint_fast32_t和{{1}选择任一类型},以及相应的无符号版本。

(对于int_least32_tint的不同大小的实现,我们可能会觉得需要使用相同的标头来影响特定的选择,但我看不出具体的定义如何你引用会达到这个目的。)

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

所做的特定选择可能是实施者的任意突发奇想 - 这是完全可以接受的。或者可能是两个或更多开发人员修改了头文件,他们对哪种类型最好有不同的想法。