为什么在x86(-64)上有符号和无符号乘法不同的指令?

时间:2012-12-28 01:49:08

标签: assembly x86 x86-64 twos-complement

我认为2的补码的重点是对于有符号和无符号数字的操作可以采用相同的方式。 Wikipedia even specifically lists multiply as one of the operations that benefits。那么为什么x86对每个mulimul都有单独的说明?这对x86-64仍然如此吗?

3 个答案:

答案 0 :(得分:31)

加法和减法是相同的,乘法的低半部分也是如此。然而,完全相乘则不是。简单的例子:

在32位二进制补码中,-1与无符号数量2 ** 32 - 1表示相同。但是:

-1 * -1 = +1
(2**32 - 1) * (2**32 - 1) = (2**64 - 2**33 + 1)

(注意两个结果的低32位是相同的;当我说“乘法的低半部分”是相同的时候,这就是我的意思。)

答案 1 :(得分:6)

对于2和3操作数版本的结果是相同的,只是mul和imul指令在设置CF和OF标志(进位和溢出)方面有所不同。

考虑两种情况:溢出方面的-1 * -1与0xFFFFFFFF * 0xFFFFFFFF,你会得到这个想法。

答案 2 :(得分:5)

两个16位数的乘法产生32位结果。即使其中一个数字为“1”,处理器也会有效地将另一个数字扩展到32位。将数字扩展到更长的位长度的过程是有符号和无符号值不同的操作之一(符号重要的另一个重要操作是幅度比较,这也是除法的重要部分)。