当我意识到:
a-2 = a-1-1 = a + (2'complement of 1) - 1
= a + (1's complement of 1 + 1) - 1
= a + 1's complement of 1
= a + 0
= a
所以最终
a-2 = a
我在这里做错了什么?
当我意识到:
a-2 = a-1-1 = a + (2'complement of 1) - 1
= a + (1's complement of 1 + 1) - 1
= a + 1's complement of 1
= a + 0
= a
所以最终
a-2 = a
我在这里做错了什么?
你弄错的地方(2'complement of 1)
不是(1's complement of 1 + 1)
。
您需要在对待操作数的方式上保持一致,无论它们表示二进制补码值还是一个补码值,都不能混合使用。
它只是一种约定,非常类似于各种编程语言中有符号和无符号标量类型之间的区别。您不能在同一个算术运算中混合有符号和无符号标量并期望结果是正确的。
具体来说:(假设 8 位整数大小,参数相同,只有 1 的比较或 2 的比较中允许的值范围不同)。
在一个补码约定中,1's complement of 1
它 11111110
是否表示值 254,这是一个无法在二进制补码约定中表示的值(使用 8 位整数);二进制补码中的值范围是 -128 到 +127。
因此,在您的推导中,您正在编写一个无效的操作,让我们使用十进制值等效项重写它:
a-2 = a-1-1 // OK, we start in 2's complement convention
= a + (-1) - 1 // OK, we're still in 2's complement convention
= a + (+255) - 1 // OOPS: we're switching our interpretation of the operand
// in parenthesis, we now understand it to be in 1's comp.
// but... wait! 255 is not in the range of the 2's comp.
// convention we started with.