2の補数の考え方を知る
2の補数は、マイナスの数を2進数で表すための表現方法です。
2の補数がどのようなものかを知るために、まずはマイナスの数を2進数で表す考え方をまず理解します。
自然な考え方
1バイト(=8ビット)で表現できるパターン数は、2の8乗=256通りとなります。
これらを0以上の整数に割り当てると、0~255の数を表現できます。
では、マイナスの数を表現したい場合はどのようにしたらよいでしょうか?
真っ先に思いつくのは、先頭1ビットを符号とみなす方法です。
この方法によれば、7ビットで表現できるパターン数が2の7乗=128通りなので、-127~127の数を表現できます。
8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 10進数 | 補足 |
---|---|---|---|---|---|---|---|---|---|
0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 127 | 正の数の最大値 |
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | -127 | 負の数の最小値(絶対値の最小値) |
人間にとっては、この表現方法が自然で、10進数→2進数、2進数→10進数の変換も容易に連想できるでしょう。
ただし、この表現方法によると「0」を表すのに、「+0」と「ー0」の2とおりの表現があって冗長となります。
人間にはとっては自然に見えるこの方法も、コンピューターにとっては最善ではありません。
2の補数
下記は、コンピューターにとって最適なマイナスの表現である、「2の補数」による表現方法です。
8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 10進数 | 補足 |
---|---|---|---|---|---|---|---|---|---|
0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 127 | 正の数の最大値 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 正の数の最小値 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ±0(ゼロ) |
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | -1 | 負の数の最大値(絶対値の最小値) |
1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | -2 | |
1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | -127 | |
1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -128 | 負の数の最小値(絶対値の最大値) |
もはや、2進数→10進数、10進→2進数の連想は不可能かもしれません。
それでは、2の補数の特徴を詳しく見ていきましょう。
「127」と「-127」、「1」と「-1」をそれぞれ加算してみてください。
いずれも、「00000000(オーバーフロー)」となったはずです。
つまり、オーバーフローを無視すれば、足し合わせた結果が0になります。
逆に言えば、プラスマイナスが正反対の2つの2進数を足したとき、結果が0となるように恣意的にマイナスの数を表現したものが「2の補数」ということです。
大事なのでもう一度繰り返します。
ここで、「恣意的に」というところがポイントです。「恣意的に」という表現を言い換えるならば、「工夫して」となるでしょうか?つまり、扱いやすくなるようにということです。
2の補数の計算方法
上記で2の補数の本質を知ってしまったあなたならもう計算は簡単なはずです。
まず、絶対値を7ビットで表現します。(例:-67)
1000011(67)
次に、0と1を反転させます。
0111100
1をプラスします。
0111101
先頭ビットに1を付加します。
10111101(-67)
確認
67と-67を足して0になることを確認してみましょう。
9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 10進数 |
---|---|---|---|---|---|---|---|---|---|
0 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 67 | |
1 | 0 | 1 | 1 | 1 | 1 | 0 | 1 | -67 | |
(1)オーバーフロー | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
コメント