2進表記で負の数を表すのは、十進表記に合わせれば当然マイナスの符号を付けるだけ。
-1, -11, -1010
これをコンピュータ内部でどう表すかは何通りかのやり方があります。
整数の計算をする時には、ここで説明する「2の補数」をとるのが便利。
負の数を考える前に正の数に1を加えていって計算機の限界を超える場合を考えてみる。
2進4桁の計算機に0から始めて1を足していく。
2進表現 | 10進表現 |
---|---|
0000 | 0 |
0001 | 1 |
0010 | 2 |
0011 | 3 |
0100 | 4 |
0101 | 5 |
0110 | 6 |
0111 | 7 |
1000 | 8 |
1001 | 9 |
1010 | 10 |
1011 | 11 |
1100 | 12 |
1101 | 13 |
1110 | 14 |
1111 | 15 |
1111に1を足すと10000になるが、4桁しかない計算機だとこれを表現できない。
4桁目からでるキャリーを検出したらエラーとして処理する設計もあり得るが、もし無視をすれば次のように続くことになる。
2進表現 | 10進表現 |
---|---|
.... | .. |
1111 | 15 |
0000 | 0 |
0001 | 1 |
0010 | 2 |
.... | .. |
4桁しかなくて、キャリーを無視すれば0に戻って1,2,3,...と繰り返すことになる。当然(無視した)16を足せば正しい値になる。
1を足して限界をこえると0に戻った。これを逆に考えると1を減じていくと0の次は-1ということになる
↓ 1 ず つ 加 算 ↓ |
2進表現 | 10進表現 | ↑ 1 ず つ 減 算 ↑ |
10進表現 |
---|---|---|---|---|
.... | .. | |||
1110 | 14 | -2 | ||
1111 | 15 | -1 | ||
0000 | 0 | 0 | ||
0001 | 1 | 1 | ||
0010 | 2 | 2 | ||
.... | .. | .. |
しかし、このままでは1111が15でもあり-1でもありで不都合なので最高位のビットが1なら負の数とする。つまり、
2進表現 | 10進表現 |
---|---|
0111 | 7 |
0110 | 6 |
0101 | 5 |
0100 | 4 |
0011 | 3 |
0010 | 2 |
0001 | 1 |
0000 | 0 |
1111 | -1 |
1110 | -2 |
1101 | -3 |
1100 | -4 |
1011 | -5 |
1010 | -6 |
1001 | -7 |
1000 | -8 |
と決めるのが、2の補数による負の整数の表現である。
もちろん、これは4ビットの場合で、8ビットならば
2進表現 | 10進表現 |
---|---|
01111111 | 127 |
... | ... |
00001111 | 15 |
... | ... |
00000101 | 3 |
00000010 | 2 |
00000001 | 1 |
00000000 | 0 |
11111111 | -1 |
11111110 | -2 |
11111101 | -3 |
11111100 | -4 |
... | ... |
10000000 | -128 |
となる。
この決め方に加えて、上で行った桁数の限界を超えたキャリーは無視するという方法をとると、正の数+負の数もそのまま計算してしまえばよい。
2 + 4 6 + (-3) -4 + 4 -3 + (-5)
負の数を表す方法のいろいろ。
補数による表現はコンピュータでの計算に便利なようになっている。「符号をつけるだけ」は最上位ビットが1ならば負の数と決め、値は最上位ビットを除いて絶対値で表現する。エクセス7はすべての数に7を足して符号無しの表現をする。7は正の範囲と負の範囲が同じになるようにしたもので、8ビットならば15などとする。
2進表現 | 符号無し | 2の補数 | 1の補数 | 符号を付 けるだけ |
エクセス7 |
---|---|---|---|---|---|
0000 | 0 | 0 | 0 | 0 | -7 |
0001 | 1 | 1 | 1 | 1 | -6 |
0010 | 2 | 2 | 2 | 2 | -5 |
0011 | 3 | 3 | 3 | 3 | -4 |
0100 | 4 | 4 | 4 | 4 | -3 |
0101 | 5 | 5 | 5 | 5 | -2 |
0110 | 6 | 6 | 6 | 6 | -1 |
0111 | 7 | 7 | 7 | 7 | 0 |
1000 | 8 | -8 | -7 | -0 | 1 |
1001 | 9 | -7 | -6 | -1 | 2 |
1010 | 10 | -6 | -5 | -2 | 3 |
1011 | 11 | -5 | -4 | -3 | 4 |
1100 | 12 | -4 | -3 | -4 | 5 |
1101 | 13 | -3 | -2 | -5 | 6 |
1110 | 14 | -2 | -1 | -6 | 7 |
1111 | 15 | -1 | -0 | -7 | 8 |