如何将整数或浮点数转换为S16.16定点格式

How to convert integer or float to S16.16 fixed point format

我的问题是关于如何将整数或浮点数转换为 S16.16 格式。

我正在阅读一些代码,说将整数或浮点数转换为 S16.16 格式可以通过乘以 2^16 对齐零点来实现。

这是否正确,有人可以解释一下它是如何工作的吗?

S16.16中的“.16”表示低16位实际上在小数点之后。例如:(有趣的 符号表示“对应于”)

0x00010000 ≘ 1.0
  ^^^^
  the whole number part
0x00028000 ≘ 2.5
0x0003C000 ≘ 3.75
      ^^^^
      the part after the radix point

或者换句话说,原始值的解释方式为:value = raw / 216

为了将普通值转换为该格式,我们需要乘以 216(用隐式除法抵消)。

示例:

1 << 16 = 0x00010000 ≘ 1.0
int(3.75 * pow(2.0, 16)) = int(245760.0) = 0x0003C000 ≘ 3.75