2の補数を使用して負の数を2進数で表します
ケース1:数値-5
2の補数手法によると:
5をバイナリ形式に変換します。
00000101
、次にビットを反転します
11111010
、次に1を追加します
00000001
=>結果:11111011
これが正しいことを確認するために、10進数に再計算します。
-128 + 64 + 32 + 16 + 8 + 2 + 1 = -5
ケース2:番号-240
同じ手順が実行されます。
11110000
00001111
00000001
00010000 => recalculate this I got 16, not -240
私は何かを誤解していますか?
問題は、240を8ビットだけで表現しようとしていることです。 8ビットの符号付き数値の範囲は-128〜127です。
代わりに9ビットで表すと、正しい答えが得られることがわかります。
011110000 (240)
100001111 (flip the signs)
+
000000001 (1)
=
100010000
=
-256 + 16 = -240
署名時に-240を8ビットで表すことができないことを忘れましたか?
8ビットで表現できる最小の負の数は-128で、これは_10000000
_です。
2の補数の使用:
128 = 10000000 (フリップ)= 01111111 (1を追加)= 10000000
Nビット(もちろん符号付き整数)で表現できる最小の負の数は、常に- 2 ^ (N - 1)
です。