固定点处理:uint16_t和uint_fast16_t有什么区别?

21

我有一台16位定点处理器,想使用它进行定点处理。我正在寻找用于无符号16位整数的正确数据类型。

我的问题是:uint16_tuint_fast16_t有什么区别?(它们包含在stdint.h中。)是否使用uint_fast16_t效率更高?

谢谢!


1
http://en.wikipedia.org/wiki/Stdint.h#Integer_types - kennytm
@kennytm提供的链接已经失效了,当前的链接是https://en.wikipedia.org/wiki/C_data_types#Fixed-width_integer_types。 - Andreas Mueller
2个回答

21

uint16_t 是一个无符号16位整数。 uint_fast16_t 是至少具有16位的最快可用无符号整数。


16
如果您能定义“最快”,那么我的回答会更有帮助。 - Chris Tonkinson
5
没关系:"标准并未要求这些类型必须做任何特定的规定,除了它们的宽度必须大于或等于N。标准也让实现者自行决定什么是“快速”的整数类型。" - Chris Tonkinson
有趣的是...让我感到奇怪的是,这种数据类型没有指定大小..它由用户决定.. o_o那么对这种数据类型执行sizeof()会导致错误吗?无论如何,我认为uint_fast16_t不适用于我。我将坚持使用uint16_t作为我的固定点算术数据类型。 :)谢谢... - O_O
4
在32位或更高的系统上,由于内存地址的访问方式,16位整数可能比32位整数慢。我在一个32位系统上实现固定点CORDIC算法时发现,即使算法仅处理16位,使用int也比short int更快。在O_O未定义的16位处理器上,我想uint16_t和uint_fast16_t之间没有区别,但如果代码移植到32位或64位系统上,可能会有很大的差异。 - oosterwal
3
“我觉得奇怪的是这个数据类型没有指定大小”--它的大小是大于等于16位的。“由用户决定”--我不知道你的意思;这取决于 实现。“那么对这个数据类型做 sizeof() 会导致错误吗?”--当然不会;uint_fast16_t 只是一个 typedef,要么是 uint16_t,要么是 uint32_t。“无论如何,我认为 uint_fast16_t 对我来说不适用。我将继续使用 uint16_t 作为我的固定点算术数据类型”--如果你不关心程序速度,只关心内存使用量,那么这样做很好。 - Jim Balter
@ChrisTonkinson 迟到总比不到好:当使用例如“uint16_t”类型的本地变量(如循环计数器)时,这隐含地请求16位溢出行为,需要在每次计算后进行截断,即使实际上可能永远不会发生溢出。因为截断不需要被执行/检查,在许多平台(如ARM32)上,使用32位变量更快。它只需要更少的计算。 - MrD

10

uint16_tuint_fast16_tuint_least16_t更为严格。后两者可能不仅可以宽于16位,还可能具有填充位(不计入值的位,如奇偶校验位)。

对于有符号类型来说,这种差异更为明显。在此情况下,精确宽度类型必须使用二进制补码表示负值。


这是否意味着任何非二补码系统都不能有可选的 uint16_t 版本? - user16217248
@user16217248,是的,这样的理论系统是不可能有的。话虽如此,似乎现在已经没有这样的平台了,所以从C23开始,所有带符号整数类型都必须使用二进制补码。标准中这些类型的定义也变得更加简单。 - Jens Gustedt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接