【问题标题】:ARM cortex-M3 uint_fast32_t vs uint32_tARM cortex-M3 uint_fast32_t 与 uint32_t
【发布时间】:2012-07-08 08:29:43
【问题描述】:

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

因此,我希望 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;

【问题讨论】:

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


    【解决方案1】:

    情况是这样,只能保证

    sizeof(long) >= sizeof(int)
    

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

    【讨论】:

    • 可能我在原帖中表达的不够清楚,所以我编辑了问题。
    【解决方案2】:

    查看我对your other question的回复。

    基本上,使用哪种类型并不重要。鉴于intlong 的大小相同并且具有相同的表示和其他特征,实现者可以为int32_tint_fast32_tint_least32_t 选择任一类型,对于相应的未签名版本也是如此。

    (对于intlong,特定选择可能会受到感知需要使用相同标头来实现具有不同大小的实现的影响,但我看不出您引用的特定定义将如何实现那个。)

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

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

    【讨论】:

    • 据我了解,涉及有符号long 和无符号int 的操作将强制将无符号值转换为有符号,即使两个变量的大小相同。如果 intlong 都是 32 位,并且 32 位操作通常比 16 位操作快到足以证明使 uint_fast16_t 也为 32 位是合理的,那么使用 long 可能会很好“32”位类型,但 int 用于“快速 16”位类型,因此 int32_tuint_fast16_t 之间的操作将按照有符号执行。
    • 实际上涉及signed longunsigned int的操作,如果两者大小相同(具有通常的范围)会将两个操作数转换为unsigned long,因为signed long不能代表所有值输入unsigned int。规则在N15706.3.1.8p1,段末;本案属于第 5 段,也是最后一段。
    • 我以为标准被更改为引入“rank”的概念,其中“long”被认为比“int”具有更高的排名,无论大小如何,虽然我有时会输跟踪哪些更改适用于 C 或 C++。就个人而言,我希望标准机构可以弃用一些 C 包并促进向使用新类型的迁移,这些新类型在适当的时候通常表现得像旧的,但与旧的不同的是,它们会在不适当的使用时大喊大叫。 C 允许无符号类型表现为抽象代数环(例如 8 位无符号值的行为类似于 Z256 的成员)...
    • @supercat:整数转换等级的概念是由 C99 引入的——但是我引用的规则(“通常的算术转换”)使用范围而不是等级,当处理有符号和无符号类型。对于有符号与有符号或无符号与无符号,较高等级的类型始终包含具有较低等级的类型的所有值。对于已签名与未签名,情况不一定如此。我认为 C90 没有费心定义“等级”,因为它需要处理的类型更少。 (嗯,我之前的评论忘记给你加标签了;你怎么这么快就看到了?它出现在你的收件箱里了吗?)
    • 根据securecoding.cert.org/confluence/display/seccode/…long 的排名高于int,并且无符号类型与大小相似的有符号类型具有相同的排名。这意味着signed long 的排名将高于unsigned int,因此操作数将被转换为有符号类型。想聊天吗?
    猜你喜欢
    • 1970-01-01
    • 2014-06-08
    • 1970-01-01
    • 1970-01-01
    • 2013-11-15
    • 2016-03-01
    • 1970-01-01
    • 2012-05-15
    • 1970-01-01
    相关资源
    最近更新 更多