コンピュータのデータは0か1の数字のみ,つまり2進法を使ってデータを処理しています.しかし,負の数や小数を表現する際には限られたビット数の中で表現する工夫が必要になります.
そこで使われるのが「補数」で,この補数を用いることで本来「引き算」であるものを「足し算」として扱うことができるんです.と言われても初めての人にとっては
引き算を足し算・・・??
といった感じに,何を言っているかよくわかりませんよね.ではまずは例を見ていくことにしましょう!
補数とは?
「そもそも2進数がよくわからない」なんて方は以下のページで2進数を勉強してみて下さいね.
さて,では補数について説明していきます.補数を簡単に言うと
コンピュータが負の数を使えるようにするための工夫
です.冒頭で言ったようにコンピュータは 「ー(マイナス)」 の符号を使ってデータを扱うことができません.そこで,符号を使わずに負の数を扱えるようにしたのが補数なんですね.
そして,肝心な補数の求め方ですが,
といった簡単な式で求めることができます.
例えば,10進数での6(以下(6)10とします)は,2進数であれば(0110)2と表現できますよね.では,ー6はどうでしょう?
例えば「基準の数=(15)10,ある数=(6)10」だとした場合,「15 ー 6 =(9)10」が補数,つまりコンピュータ上では「ー6 =9」となるわけです.
今回は例として基準の数=15としましたが,この「基準の数」の決め方にもしっかりとした決まりがあります.2進数の場合,補数,基準の数の決め方は2種類存在します.
1の補数
基準の数は「そのケタ数で表せる最大値」.この場合の補数を「1の補数」と言います.10進数で6の場合を例に考えてみましょう.
(6)10は,2進数で(0110)2です.つまり,基準の数は4ケタ全てが1のときの(1111)2 = (15)10となります.よって, (6)10 の1の補数は15ー6=(9)10 となります.
2の補数
基準の数は「そのケタ数で表せる最大値+1」.この場合の補数を「2の補数」と言います.先ほどと同様の例で考えてみましょう.
(6)10は,2進数で(0110)2です.つまり,基準の数は4ケタ全てが1のときの(1111)2 +1= (16)10となります.よって, (6)10 の1の補数は16ー6=(10)10 となります.
2進数だけで考えよう
上の式のように一度10進数に直してから計算するのが直感的にはわかりやすいですが,2進数と10進数を行ったり来たりと面倒ですよね.
そのため,補数を求めるときには10進数に計算しなおさず,2進数のみで考えるようにしましょう!
するとこんな簡単な手順で1の補数,2の補数を求めることができます.
- 2進数で表したときの,1と0の数字を反転させる.
- 1の補数ならそのまま完成.2の補数は+1だけしてあげる.
1の補数と2の補数の違いは?
しかし,何故1の補数と2の補数なんていう2種類も補数が存在するのでしょうか?区別するのに少し面倒ですよね.
1の補数と2の補数の大きな違いは「元の数(ある数)と足したときにケタが増えるか増えないか」です.
今までの例で言えば,
- 1の補数を使用:(0110)2 +(1001)2 =(1111)2
- 2の補数を使用:(0110)2 +(1010)2 =(10000)2
となるわけです.これが計算するときの肝になってくるわけですが,取りあえずコンピュータ上で計算をするときに2の補数がよく使われることを覚えておきましょう.
1の補数は0と1が完全に反転するため、コンピュータ上で「ビット反転」の処理をしたい場合に使用することができますが,これはまた別の機会に.
表せる数値の範囲に注意!
負の数も表す場合には,正の数のみを表す場合とは表せる数値の範囲が変わることに注意しましょう.
例えば,4ケタの2進数の場合,正の数のみを表す場合には(0000)10から(1111)10(10進数での0から15)の範囲を表していましたが,負の数も表す場合にはこれが10進数でのー8から7までとなります.
2進数における一番左の数が1のとき,それは全て負の数になるという点に注意しましょう.
コメント