1

私が気付いたとき、私は運動をしていました:

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

私はここで何を間違えましたか?

4

1 に答える 1

3

あなたが間違ったところは、そうで(2'complement of 1)はないということです(1's complement of 1 + 1)

オペランドを扱う方法に一貫性を持たせる必要があります。オペランドは 2 の補数の値を表すか、1 の補数の値を表すかのどちらかです。両方を混在させることはできません。

これは単なる規則であり、さまざまなプログラミング言語における符号付きスカラー型と符号なしスカラー型の違いによく似ています。同じ算術演算で符号付きスカラーと符号なしスカラーを混在させて、結果が正しいと期待することはできません。

具体的には: (8 ビットの整数サイズを想定すると、引数は同じですが、1 の構成または 2 の構成で許可される値の範囲が異なります)。
1 の補数規則で1's complement of 111111110 、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.  
于 2012-10-17T14:51:04.787 に答える