10進数の場合は正の値を引く操作は負の値を足す動作に同義です。コンピュータは基本的に加算のオペレーションしか持っていないため、減算を行う際も裏で加算を利用します。補数を用いることで、負の数を「特定の形式の正の数」として表現し、加算のみで減算を実現することができます。そこで、負の数を表すための工夫として補数が利用されます。
補数の種類
- 1の補数: 各ビットを反転します。つまり、0は1に、1は0に変わります。
- 2の補数: 1の補数を取った後に、1を足します。現代のコンピュータでは、2の補数が主に用いられています。
実際の使い方
考え方をシンプルにするため、3ビットの数「010」(十進数で2)を例にとります。
- 1の補数: ビットを反転させます。したがって、「010」の1の補数は「101」です。
- 2の補数: 上記の1の補数「101」に1を足すと「110」となります。この「110」は、3ビットの数で「-2」を表しています。
2の補数が広く使われる理由は、計算の簡潔さにあります。例えば、正の数「010」とその2の補数「110」を加算すると、結果は「1000」となりますが、最上位のビット(オーバーフロー)を無視すると、答えは「000」、つまり0となります。これは、2と-2を加算したときの結果が0になることを反映しています。
この補数のシステムにより、コンピュータは加算のみを用いて、減算を効率的に実行できます。
補数の定義
- 10進数での補数
- 9の補数10進数における9の補数は、各桁の数を9から引くことで求めることができます。例: 2桁の数 23 の9の補数を求める場合、各桁を9から引くと、76 となります。よって、23の9の補数は76です。
- 10の補数9の補数に1を足すことで、10の補数を求めることができます。上の例の続きで、23の10の補数を求める場合、9の補数である76に1を足すと、77となります。よって、23の10の補数は77です。
- 2進数での補数
- 1の補数2進数の1の補数は、各ビットを反転することで得られます。例: 3ビットの数 101 の1の補数を求める場合、各ビットを反転すると、010 となります。よって、101の1の補数は010です。
- 2の補数1の補数に1を足すことで、2の補数を求めることができます。上の例の続きで、101の2の補数を求める場合、1の補数である010に1を足すと、011となります。よって、101の2の補数は011です。
10進数の9の補数や10の補数、2進数の1の補数や2の補数は、負の数の表現や算術演算を容易にするために用いられます。特に、コンピュータの内部では、2の補数形式が負の数の表現や加減算の処理に広く使用されています。
符号(SD)について
コンピュータ内部では、数値はビット列として表現されます。正負を示すために、最も左のビット(最上位ビット)を符号桁(SD)として使用する場合があります。このビットが0の場合、その数は正と解釈され、1の場合は負と解釈されます。
例えば、8ビットの2進数で考えた場合、1001 1010
の最上位ビットは1なので、この数は負の数を示していると解釈されることが多いです。
符号と絶対値による表現や、2の補数表現など、符号を扱う方法はいくつかありますが、この「SD」はその符号を示すためのビットを指していることが多いです。
下記に4ビットの負数の表現法を示します。
10進数 | SD+絶対値 | 2の補数 | 1の補数 |
---|---|---|---|
7 | 0111 | 0111 | 0111 |
6 | 0110 | 0110 | 0110 |
5 | 0101 | 0101 | 0101 |
4 | 0100 | 0100 | 0100 |
3 | 0011 | 0011 | 0011 |
2 | 0010 | 0010 | 0010 |
1 | 0001 | 0001 | 0001 |
0 | 0000 | 0000 | 0000 |
-1 | 1001 | 1111 | 1110 |
-2 | 1010 | 1110 | 1101 |
-3 | 1011 | 1101 | 1100 |
-4 | 1100 | 1100 | 1011 |
-5 | 1101 | 1011 | 1010 |
-6 | 1110 | 1010 | 1001 |
-7 | 1111 | 1001 | 1000 |
-8 | なし | 1000 | なし |
補数を使った負の値の表し方
補数による負の数の表し方は、コンピュータの内部で負の数を表現する一般的な方法です。2つの主要な補数表現法があります。
・1の補数
1の補数の表現は非常にシンプルです。先頭ビットに0を追加し、各ビットを反転(0を1に、1を0に)するだけです。例を見てみましょう。
正の数: 0101
(10進数で5) 1の補数: 1010
しかし、1の補数には2つのゼロ(正のゼロと負のゼロ)が存在するという問題があります。このため、多くのコンピューターシステムでは2の補数を使用しています。
・2の補数
2の補数は、1の補数を取った後に1を加えることで得られます。これは、多くのコンピューターシステムでの負の数の標準的な表現方法です。
正の数: 0101
(10進数で5) 1の補数: 1010
2の補数: 1011
(1を加える)
2の補数には、1つのゼロのみが存在し、算術が簡単になるという利点があります。実際、加算と減算の操作は、正数と負数の両方で同じ方法で動作し、特別な考慮は不要です。
補数を使った減算
補数を使用すると、減算を加算として表現することができます。2の補数が最も一般的に使用されるので、ここでは2の補数を用いた減算について説明します。
基本的な考え方: A - B の計算をしたい場合、Bの2の補数を取ってAに加えることで、結果が得られます。
手順:
- Bの2の補数を取得します。
- AにBの2の補数を加えます。
- オーバーフローが発生する場合、それを無視します(最上位の桁のキャリーオーバー)。
例題: 7 - 5 = ?
2進数で表現すると: 7: 0111
5: 0101
- 5の2の補数を計算します。 1の補数:
1010
(ビット反転) 2の補数:1011
(1加算) 0111
(7) に1011
(-5) を加えます。10010
となりますが最上位の桁(1)はオーバーフローとして無視します。結果は0010
で、これは2を意味します。
したがって、7 - 5 = 2、2進数で 0010
です。
この方法を使用すると、減算ハードウェアを実装する必要なく、加算ハードウェアのみを使用して減算を実行できるので、コンピュータの設計が簡単になります。