2進数におけるマイナス値の表現方法
2 進数でマイナス値を表現するために
素朴な疑問で、なぜ 2 進数でマイナス値を表現するために試行錯誤されているのか。
それは私達が日常で利用する 10 進数と異なり 2 進数では -
を表す記号が存在しないためである。
そのため 2 進数において、マイナス値を表現するためにはいくつかの方法があります。この記事ではそれを順に紹介していきます。
方法 1: 左端に左端の符号ビット(MSB)を符号として利用する方法
この方法は、10 進数で私達が普段から目にする方法に似ています。 2 進数の場合は、左端の桁を符号として利用し 1 ならマイナス。0 ならプラスという意味を表すようにします。
そのため 8bit の場合、数値を表せるのは 7bit のみになります。
例えば、-24 をこの方法で表すと、
- まずマイナスが無い 24 を定義する
- 24 を 2 進数に表すと、11000 になる
- 桁が 5 桁なので、8 桁にするために 1 を加え(マイナス値の場合 1)、その間を 0 で埋めると 10011000 となる
表現方法としてはとてもシンプルだが、この方法では比較演算の際に複雑になってしまったりゼロを表現するために重複して不要な bit を使うなどの点で、実利用が難しいというデメリットがある。
方法 2: 補数
そもそも補数とは何かということから説明します。 補数には、「基数の補数」と「減基数の補数」という 2 つが存在します。
基数の補数(1 の補数)
基数の補数補数とは、元の数を足したときに桁上がりする「最小」の数 のことを指します。 例えば、10 進数における 4 の補数は 6(4+6=10)、84 の補数は 16(84+16=100)となります。
これを 2 進数で応用することによって、マイナス値を表現することができます。 2 進数で補数(基数の補数)を計算するには、単純に値を反転させるだけで表現することが可能です。
例えば、 -25 をこの方法で表すと、
- まずマイナスが無い 25 を定義する
- 25 を 2 進数に表すと、11001 になる
- 桁を 8 桁にするために、0 を加えて埋めると 00011001 になる
- 値をすべて反転させて、11100110 となる
1 の補数を利用する場合、1bit(1 桁)がマイナス or プラス表現に利用されることになるため表現できる範囲としては以下になります。
-2^n-1 -1
から 2^n-1 -1
となり、例えば 10bit だった場合は、-511 から 511 を表現できることになります。
減基数の補数(2 の補数)
対して、減基数の補数とは、元の数を足したときに桁上りしない「最大」の数 のことを指します。 例えば、10 進数における 4 の場合は 5(4+5=9)、84 の補数は 15(84+15=99)となります。
2 進数で補数(減基数の補数)を計算するには、単純に値を反転させ、1 を足すだけで表現することが可能です。
例えば、 -28 をこの方法で表すと、
- まずマイナスが無い 28 を定義する
- 28 を 2 進数に表すと、11100 になる
- 桁を 8 桁にするために、0 を加えて埋めると 00011100 になる
- 値をすべて反転させ最後に 1 を加えて、11100100 となる
2 の補数を利用する場合、1 の補数を用いるよりも多い数を表現することができます。
-2^n -1
から 2^n-1 -1
となり、例えば 10bit だった場合は、-512 から 511 を表現できることになります。
2 進数において、引き算を表現する際にこの補数を利用することによって 足し算として 処理することができます。 これはコンピュータ内で足し算をする場合は、加算機というコンポーネントを引き算をする場合は、減算器というコンポーネントを利用する必要があるのですが、補数を用いて引き算を マイナス値との足し算 とすることによって、減算器というコンポーネントが不要になるというメリットが有るようです。
よくわからない方のために、なぜ 2 の補数を利用するのかについて参考になった記事を参照しておきます。なぜ「2の補数」を使うのか
要は以下のように a - b = a + (-b) とすることによって、引き算ではなく足し算で引き算も表現することができるということです。
例えば、69-12 を足し算を利用して 2 進数で表現すると、
- 69 を 2 進数に表すと、01000101
- 12 を 2 進数に表すと、00001100 になり、2 の補数は 11110100 となる
- この 2 つを足し算することで、00111001 となる