28

我认为 2 的补码的全部意义在于,对于有符号和无符号数字,操作可以以相同的方式实现。Wikipedia 甚至专门将乘法列为受益的操作之一。那么为什么 x86 对每个都有单独的指令,mul并且imul?x86-64 仍然如此吗?

4

3 回答 3

37

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

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

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

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

于 2012-12-28T02:00:39.787 回答
7

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

于 2014-02-09T00:47:41.020 回答
7

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

考虑两种情况:-1 * -1 与 0xFFFFFFFF * 0xFFFFFFFF 在溢出方面,你会明白的。

于 2013-03-07T01:13:27.923 回答