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

我认为2的补充的全部意义在于可以以相同的方式对有符号和无符号数字执行操作。 维基百科甚至专门列出乘法作为有益的操作之一 。 那么为什么x86对每个mulimul都有单独的指示? 这对于x86-64还是这样吗?

加法和减法是一样的,就像一个乘法的低半部分一样。 然而,完整的乘法不是。 简单的例子:

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

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

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

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

想想两种情况:-1 * -1与0xFFFFFFFF * 0xFFFFFFFF就溢出而言,你会明白的。

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