为什么某些 CPU 具有不同的指令来执行已签名和未签名的操作?



假设我们有以下二进制数及其表示形式:

| bin | unsigned | signed   |
|:---:|----------|----------|
| 110 | 6        | -2       |
| 111 | 7        | -1       |

现在,无论签名还是未签名,111 + 110 = 1101, 现在我可以将结果1101解释为有符号或无符号,即:

| bin  | unsigned | signed   |
|:----:|----------|----------|
| 1101 | 13       | -3       |

与十进制运算匹配:

6+7 = 13
-1-2 = -3

signed additionunsigned addition没有区别。那么,为什么CPU会有不同的电路/指令来进行这样的操作呢?

因为 2 的补码添加/sub 与无符号的添加/sub 是相同的二进制操作。 但为了进行比较(以及除法和加宽乘法(,将MSB解释为符号位或不重要。

有些 CPU 只有一个设置所有标志的cmp指令,然后你让分支指令检查特定的标志条件(谓词(。 其他没有标志/条件代码的CPU(如MIPS和RISC-V(在其比较寄存器指令中需要谓词。

x86/ARM 上的 SIMD 比较指令也是比较寄存器,没有设置多个不同的标志,因此它们也将谓词作为比较指令的一部分(例如cmpps谓词立即占用一个字节,或者对于整数,有pcmpgtd/pcmpeqd(。

这取决于二进制表示。这是 2s 补码表示的一个要点 - 当使用 2s 补码时,固定宽度操作数的有符号和无符号加法、减法和多重运算数和相同宽度的结果是相同的,因此您可以对两者使用相同的硬件指令。

如果使用 1s 补码或符号幅度,则需要有符号和无符号操作之间的细微差异。

这里的部门不同,扩大业务也是如此。

最新更新