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

O_O*_*O_O 14 c fixed-point

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

我的问题是:a uint16_tuint_fast16_t?有什么区别?(这些都包含在stdint.h.)uint_fast16_t更好,因为它更快?

谢谢!!

Sve*_*ven 14

uint16_t是无符号的16位整数.uint_fast16_t是最快的无符号整数,至少有16位.

  • 如果你能定义"最快",答案会更有帮助. (11认同)
  • 没关系:"标准并没有强制要求这些类型的任何东西,除了它们的宽度必须大于或等于N.它还让实现者决定它是什么意思是"快速"整数类型." (3认同)
  • @O_O“令我感到奇怪的是,该数据类型没有指定大小”——它的大小 >= 16 位。“这取决于用户”——不知道你的意思;这取决于*实施*。“那么对此数据类型执行 sizeof() 会导致错误吗?” - 不,当然不; uint_fast16_t 只是 uint16_t 或 uint32_t 的 typedef。“无论如何,我认为 uint_fast16_t 不适用于我。我只会坚持使用 uint16_t 作为我的定点算术数据类型”——如果你不关心你的程序是否快,那就没问题。关心内存使用情况。 (3认同)
  • 在32位或更高系统上,由于访问内存地址的方式,16位整数可能比32位整数慢.我在一个实现定点CORDIC算法的32位系统上发现了这个问题.事实证明,使用*int*比*short int*更快,即使算法只处理了16位.在O_O未定义的16位处理器上,我认为unint16_t和uint_fast16_t之间没有区别,但如果代码被移植到32位或64位系统,则可能会有很大的不同. (2认同)

Jen*_*edt 7

uint16_tuint_fast16_t和更具限制性uint_least16_t.不仅后两个可能宽于16位,它们也可能具有填充位(不考虑诸如奇偶校验位的值的位).

对于签名类型,这种差异甚至更明显.这里确切的宽度类型必须使用二进制补码来表示负值.