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

How to add fixed point with two's complement fixed point?

我想将无符号整数 5432 乘以 0.01,然后 add/subtract 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 点中遗漏的内容吗?

您的错误在于您假设 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 这是 [=20 的定点表示=]