あなたは、正の数と負の数を区別する何かがなければならないことを忘れていたので混乱しています。
負でない数を8ビットで格納したいとしましょう。
00000000 は0、
00000001 1、
00000010 2、
00000011 3、
00000100 4、
- ...
11111111 255です
そのため、0から255の範囲の数字を8ビットで格納できます。 255 = 2 8 - 1.(2は2進法の基数、8はビット数、0は0でカウントしたいので1が減算されます)
さて、あなたも負の数を保存したいとしましょう。どうすればそれを達成できますか。私たちはサインのために1ビットを捧げることができます。このビットが 0 それから私達は他の7ビットを正数、そうでなければ負数として解釈する。いくつかの操作が簡単になるため、署名に最上位ビットを使用するのが最善です。
2の補数が最適なのはなぜですか?
- それが最も広い範囲を持っているので:-128 ... 127、自明なアプローチと1の補数は-127 ... 127
- ゼロは明確に定義されています。
- 2の補数のみ
00000000 ゼロです
- 些細なアプローチでは両方とも
00000000 そして 10000000 ゼロです
- 両方のものを補完する
00000000 そして 11111111 ゼロです
- 加算と減算は符号なしの数と同じであるため、CPUは符号付きの数を加算するための追加の命令を必要としません。
最上位ビットを符号ビット専用にすると、必要なビット数が分からないと数値をバイナリに変換できません。例えば、4ビットだとしたら、自明なアプローチでは-5という数は 11017ビットでは、 1000101。 0001101 (7ビット長にゼロが埋め込まれた4ビット-5)は実際には13です(最上位ビットは0なので、正の値です)。
私はあなたのために宿題をするつもりはないが、私はあなたに一般的な助言を与えることができる:
変換する -x に N ビット長2の補数表現:
- 変換する
-x 2の補数を使用してバイナリに
- 左にゼロで埋めます
N-1 長さ
- 左側に負の符号ビットを追加します。
私はあなたがこの答えから残りを理解できると思います。質問がある場合は、コメントを残してください。