我正在尝试使用定点数解决乘法问题。这些数字是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相差很大。如果您能回答我的问题,我将不胜感激。