ARM cortex-M3 uint_fast32_t vs uint32_t

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

情况是,只保证

 sizeof(long) >= sizeof(int) 

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

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

基本上,使用哪种类型无关紧要。 鉴于intlong具有相同的大小并具有相同的表示和其他特征,实现者可以为int32_tint_fast32_tint_least32_t选择任一类型,对于相应的无符号版本也可以选择。

(对于intlong ,不同大小的实现使用相同标头的感知需求可能会影响特定选择,但我不知道您引用的特定定义将如何实现。)

只要类型是正确的大小并满足标准强加的所有其他要求,并且只要您不编写依赖于的代码,例如, int32_tint兼容,或者使用long ,它就不会无所谓

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