有任何语义差异吗?在特定情况下,其中之一可能会更快吗?
3 回答
如果您已经-x
预先计算,那么sub smth, x
将add smth, -x
同样快速地执行。
从语义上讲,船旗状态会有所不同。
考虑做 8 位加减法:
0x01 - 0x01 = 0x00, CF = 0
0x01 + 0xFF = 0x00, CF = 1
除了标志不同之外,如果x
是一个常数,选择一个或另一个可能会导致更短的编码(很少)。
加法和减法都有一种op r/m32, imm8
形式,其中立即操作数是一个字节,但该字节是符号扩展的。所以add edx, 128
必须用 dword 立即sub edx, -128
数编码,但可以用符号扩展字节编码(节省 3 个字节)。
正如 Alexey Frunze 所指出的,船旗国有所不同。此外,可能的可表示值的数量存在差异。在二进制补码系统中,负值比正值多一个。添加一个负数可以让您利用这一点,减去一个正数则不会。
编辑:
根本问题是我们通常认为的“整数”实际上并不是整数。在数学术语中,它们是商环的成员,商环是抽象代数中的一个概念。这意味着对于每个 32 位“整数” a
,还有另一个 32 位“整数” b
,例如a + b = 0
. 这些数字被视为“正面”还是“负面”只是一种解释。这意味着我的观点既正确又不正确。就商环而言,它是不正确的,但就我们通常的解释而言,它是正确的。一定有一些数字我们可以减去并得到与添加 -2147483248 相同的结果。然而,这个数字不是 2147483248,这似乎违反直觉。