如何用二进制补码定点相加定点?

时间:2019-01-17 18:10:06

标签: math twos-complement fixed-point

我想将无符号整数5432乘以0.01,然后加/减0.3。除了使用浮点数,我还想使用定点算法。这是我的步骤:

1)((1 << 16)* 0.01)= 655 =>定点Q0.16

2)655 * 5432 = 3557960 =>定点Q16.16

3)((1 << 16)* 0.3)= 19660 =>定点Q0.16

4)添加0.3:3557960 + 19660 = 3577620 =>转换为浮点数= 54.59与使用浮点计算几乎相同:5432 * 0.01 + 0.3 = 54.62

5)减去0.3:找到19660的补码=> 45876,现在是3577620 + 45876 = 3623496 => 55.29,这与预期的不同5432 * 0.01-0.3 = 54.02

任何人都可以验证我在第1-4点中是正确的,以及我在第5点中所缺少的吗?

1 个答案:

答案 0 :(得分:2)

您的错误是您假设2补码表示形式与字长无关。它不是。 19660的16位2补码是2^16 - 1966045876,但是由于您使用的是32位数字,因此需要一个对应的2补码2^32 - 199604294947636。换句话说,当您将2的补码从16位扩展到32位时,应使用符号位来填充最高字节,即1为负值。您可以看到在扩展名下,二进制值实际上是相同的:

45876      =                   10110011_00110100 (16-bit binary)
4294947636 = 11111111_11111111_10110011_00110100 (32-bit binary)

如果添加3557960 + 4294947636,则会得到4298505596,或者将其截断为32位值-3538300,这是53,99的定点表示形式