我正在尝试用定点数解决乘法问题。数字是 32 位的。我的架构是 8 位的。所以这里是:
我使用 8.8 表示法,即 8 表示整数,8 表示分数。
我有 A78,它是 10.468。我取它的二进制补码,答案是 FFFFF588,我将它截断为 16 位作为 F588 并存储它。原因是,我只想将两个 2 字节数相乘。
现在,当我将此 F588(负 10.42 或 0x0A78)乘以 0xFF4B(即 0x00B5(0.707)的二进制补码)时,答案应该是 0x0766。或者类似的东西。
另一方面,我得到的是 66D8。
现在有趣的是:如果我将 B5 的负数存储在 32 位的二进制补码中,我得到 0xFF5266D8,我将其右移 8 位,然后截断为 16 位,答案是 0x5266。
另一方面,如果我将负数 10.42 存储在 32 位中,我得到 0xF58F66D8,在移位 8 位并截断后变为 8F66。
但是,如果我将两个数字都存储为 32 位格式,那么只有在移位和截断后才能得到正确的结果,即 0x0766。
为什么会这样?我知道当我们从 32 位到 16 位时,信息丢失是固有的,但是 0x07 与 0x55 有很大不同。我将非常感谢您的回复。