当我意识到时,我正在做练习:
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
我在这里做错了什么?
答案 0 :(得分:3)
错误的地方是(2'complement of 1)
不是(1's complement of 1 + 1)
。
你需要在处理操作数的方式上保持一致,要么它们表示两个补码值,要么表示一个补码的值,不能将两者混合使用。
它只是一种惯例,非常类似于各种编程语言中有符号和无符号标量类型之间的区别。您不能在同一算术运算中混合有符号和无符号标量,并期望结果是正确的。
具体 :(假设8位整数大小,参数只与1的comp。或2的comp。中允许的值范围相同)。
在一个补码约定中,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.