9

有任何语义差异吗?在特定情况下,其中之一可能会更快吗?

4

3 回答 3

14

如果您已经-x预先计算,那么sub smth, xadd smth, -x同样快速地执行。

从语义上讲,船旗状态会有所不同。

考虑做 8 位加减法:

0x01 - 0x01 = 0x00, CF = 0
0x01 + 0xFF = 0x00, CF = 1
于 2013-01-19T16:56:12.863 回答
5

除了标志不同之外,如果x是一个常数,选择一个或另一个可能会导致更短的编码(很少)。

加法和减法都有一种op r/m32, imm8形式,其中立即操作数是一个字节,但该字节是符号扩展的。所以add edx, 128必须用 dword 立即sub edx, -128数编码,但可以用符号扩展字节编码(节省 3 个字节)。

于 2013-01-19T17:10:17.250 回答
3

正如 Alexey Frunze 所指出的,船旗国有所不同。此外,可能的可表示值的数量存在差异。在二进制补码系统中,负值比正值多一个。添加一个负数可以让您利用这一点,减去一个正数则不会。

编辑:

根本问题是我们通常认为的“整数”实际上并不是整数。在数学术语中,它们是商环的成员,商环是抽象代数中的一个概念。这意味着对于每个 32 位“整数” a,还有另一个 32 位“整数” b,例如a + b = 0. 这些数字被视为“正面”还是“负面”只是一种解释。这意味着我的观点既正确又不正确。就商环而言,它是不正确的,但就我们通常的解释而言,它是正确的。一定有一些数字我们可以减去并得到与添加 -2147483248 相同的结果。然而,这个数字不是 2147483248,这似乎违反直觉。

于 2013-01-19T17:02:44.243 回答