C 手臂皮质-M3 uint\U fast32\U t vs uint32\U t

C 手臂皮质-M3 uint\U fast32\U t vs uint32\U t,c,types,sizeof,primitive-types,cortex-m3,C,Types,Sizeof,Primitive Types,Cortex M3,我正在为STM32Fx cortex-M3系列处理器开发一个程序。标准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

我正在为STM32Fx cortex-M3系列处理器开发一个程序。标准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(long) >= sizeof(int)
而且也不能保证它实际上已经存在了。在许多系统上,int通常与long一样大。

请参阅我的答案

基本上,使用哪种类型并不重要。考虑到
int
long
的大小相同,并且具有相同的表示和其他特征,实现者可以为
int32\u t
int\u fast32\u t
int\u least32\u t
选择任何一种类型,对于相应的未签名版本也是如此

(对于
int
long
的不同大小的实现,可能需要使用相同的报头,这可能会影响特定的选择,但我不知道您引用的特定定义如何实现这一点。)

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


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

也许我在原始帖子中不够清楚,所以我编辑了这个问题。据我所知,涉及有符号的
long
和无符号的
int
的操作将强制无符号值为有符号,即使两个变量的大小相同。如果
int
long
都是32位,并且32位运算通常比16位运算快得多,足以证明将
uint\u fast16\u t
也设为32位,那么对于“32”位类型使用
long
,而对于“快速16”位类型使用
int
,可能会更好,因此,
int32\u t
uint\u fast16\u t
之间的运算将以有符号方式执行。实际上,涉及
有符号长
无符号整数
的运算,如果两者大小相同(具有通常的范围),则将两个操作数转换为
无符号长
,因为
signed long
不能代表
unsigned int
类型的所有值。本段末尾的6.3.1.8p1中给出了规则;这个案例涉及到第五个也是最后一个段落。我认为标准被改变来引入“排名”的概念,在这里,“Load”被认为比“int”具有更高的等级,无论大小,尽管有时我会忘记哪些更改适用于C或C++。就我个人而言,我希望标准机构能够摒弃一些C包袱,并促进向新类型的迁移,这些新类型在适当的时候通常会表现得像旧类型,但与旧类型不同的是,它们会在不适当的使用时发出嘎嘎声。C允许无符号类型表现为抽象代数环(例如,8位无符号值表现为Z256的成员).@supercat:整数转换秩的概念是由C99引入的——但我引用的规则(通常的算术转换)在处理有符号与无符号类型时使用范围,而不是秩。对于有符号与有符号或无符号与无符号,较高秩的类型始终包含具有较低秩的类型的所有值。对于签名与未签名,情况未必如此。我认为C90没有费心定义“等级”,因为它需要处理的类型更少。(嗯,我忘了在我之前的评论中给你加标签了;你怎么看得这么快?它出现在你的收件箱里了吗?)根据a
long
的排名高于
int
,而未签名类型的排名与大小相同的签名类型的排名相同。这意味着
有符号长
的秩将高于
无符号整数
,因此操作数将转换为有符号类型。想聊聊吗?
typedef unsigned int uint_fast32_t;
typedef unsigned int uint_least32_t;
typedef unsigned int uint32_t;
sizeof(long) >= sizeof(int)