私が気付いたとき、私は運動をしていました:
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)
。
オペランドを扱う方法に一貫性を持たせる必要があります。オペランドは 2 の補数の値を表すか、1 の補数の値を表すかのどちらかです。両方を混在させることはできません。
これは単なる規則であり、さまざまなプログラミング言語における符号付きスカラー型と符号なしスカラー型の違いによく似ています。同じ算術演算で符号付きスカラーと符号なしスカラーを混在させて、結果が正しいと期待することはできません。
具体的には: (8 ビットの整数サイズを想定すると、引数は同じですが、1 の構成または 2 の構成で許可される値の範囲が異なります)。
1 の補数規則で1's complement of 1
は 11111110
、2 の補数規則 (8 ビット整数) では表現できない値である値 254 を表します。2 の補数で指定できる値の範囲は -128 ~ +127 です。
したがって、あなたの派生では、無効な操作を書いています。10 進数値の同等性を使用して書き直しましょう。
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.