【コンピューターサイエンス】 2進数におけるマイナス値の表現方法

方法1: 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となる