在计算机系统程序员的观点(2.3.5)一书中,计算二进制补码乘法的方法描述如下:
C中的符号乘法通常通过将2w位乘积截断为w位来执行。 将二进制补码数截断为w位等效于首先计算其值取2 w 为模,然后从无符号转换为二进制补码。
因此,对于相似的位级操作数,为什么无符号乘法与二进制补码乘法不同?为什么二进制补码乘法需要进行符号扩展?
要计算无符号和二进制补码的相同位表示,我们可以转换二进制补码的参数,然后执行无符号加法,最后转换回二进制补码。
由于乘法包含多个加法运算,为什么无符号乘法和二进制补码乘法的完整表示形式不同?
答案 0 :(得分:1)
图2.27演示了以下示例:
+------------------+----------+---------+-------------+-----------------+
| Mode | x | y | x · y | Truncated x · y |
+------------------+----------+---------+-------------+-----------------+
| Unsigned | 5 [101] | 3 [011] | 15 [001111] | 7 [111] |
| Two's complement | –3 [101] | 3 [011] | –9 [110111] | –1 [111] |
+------------------+----------+---------+-------------+-----------------+
如果将101乘以011,将得到1111(等于001111)。那么,他们是如何得到110111的二进制补码呢?
这里的要点是要获得正确的6位二进制补码乘积,您需要乘以6位二进制补码。因此,您需要首先将-3和3和3转换为6位的二进制补码表示形式:-3 = 111101,3 = 000011,然后再将它们相乘111101 * 000011 =10110111。还需要将结果截断为6位以最终从上表中获得110111。