符号付き数値表現
符号付き整数表現は、負の整数を2進数で表現する際の問題を解決するために使用される。2進数の負の符号(-)を格納しようとすると、負の代入を表現するために使用する状態がなくなるという問題がある。マイナスをオフ、プラスをオンとすることはできない。コンピュータはそれが数字なのか符号なのかを知る術がないからだ。
この問題を解決するために、コンピュータ設計者は負の2進数を格納する方法として、符号と大きさ、および2の補数という2つの方法を考案した。これらは、符号付き数値の代替表現となる。
サイン&マグニチュード
Sign and Magnitudeは、数値が負の場合、最上位ビット(MSB - 1桁目)を1に変更し、数値を1つ減らすなどの動作をします。
0000 0010 (2)
になる
1000 0010 (-2)
負の2進数を格納するこの方法は、以下の理由でうまくいきません。
- 二進数演算が効かない
- まず、ある言語のコンパイラがどの記憶機構を使っているかを知る必要がある。
1の補数
1の補集合は、例えば、1を0に、0を1に入れ替えることで機能します。
0000 0010 (2)
になる
1111 1101 (-2)
符号-振幅法と同様に、最上位ビットが1であるため、簡単に負の数と定義されます。
2の補数
2の補集合は、ネガを保存する方法としてはより難しい。そのために3つのステップがあります。
- 正の2進数(例:8base 10 = 0000 1000base 2)を求めます。
- 1を0に、0を1に入れ替える(例:0000 1000base 2が1111 0111base 2になる)。
これは「ビットの反転」と呼ばれるもので、元の基数2の表現に論理的NOTを適用することです。
- 1を加算する(例:1111 0111base 2 + 1base 2 = 1111 1000base 2)。
この方式が好まれるのは
- 符号と大きさのようなもので、負の数は1から始まり、正の数は0から始まる。
- 2進法の演算はうまくいく。
- 0の値は1つだけです(0000 0000base 2)。