2進数で負の数や小数をあらわしてみる

N進法

こんにちわ。

 

今回もコンピュータとは切っても切り離せない(?)2進数の話です。

前回、2進数での四則演算(ただし、割り算は除く)を簡単に説明してみました。

 

2進数の四則演算をやってみる
こんにちわ。 今回は2進数で四則演算ってどうやっているのか、まとめてみました。 コンピュータが苦手な方でも、こんなもんか。。。ぐらいに理解してもらえる内容にしたいなと思います。 コンピュータの中ではこういう...

 

 

割り算は小数になったり、余りが出たりすると複雑になるのでぼくのような一般人が説明を書くのが難しく、省略しました。

そして前回、引き算についても引き算した結果、マイナス(負の数)になった場合、2進数ではどう表現するかを説明できていません。

 

今回は計算は別として、マイナスや少数をどう表すかの基本について考えてみたいと思っています。

 

 

スポンサーリンク

2進数で負の数を表す

 

わかりやすくするために、8ビットを前提にお話しします。

8ビットであらわせる2進数は

00000000(10進数で0)~11111111(10進数で255)

となります。

 

ですが、これですと負の数(マイナス)を表現する余地はありません。

 

 

補数を使う

 

ここに「補数」という考え方を追加します。

 

補数の定義は省略しますが、最上位ビットを符号ビットとします。

最上位ビットが「0」なら正の数、「1」ならば負の数を表します。

 

なので、正の数は

0000000(10進数の0)~1111111(10進数の127)

の範囲となります。

じゃ、負の数はというと

11111110000000

です。

ここからが補数の考え方になります。

 

まずは、正の数の0より1小さい数は?というとこう表します。

 

0000000(10進数で0)

の次は

1111111(10進数でー1)

なんです。

 

ここから、1減ると

1111110(10進数のー2)

となります。

 

この補数の考え方は、いくつかメリットがあります。

たとえば、正の数から負の数を作るときですが、

 

①正の数を全て反転させる。

②そのあと、1を加えてやる。

 

で負の数に変換できます。

 

たとえば、2をー2に変換してみましょう。

 

0000010 <-10進数の2です。

1111101 <-反転させます。最上位ビットが1なのでマイナスになりました。

1111110 <-1を足すと、上記のー2と同じになりました。

 

 

コンピュータはホントは引き算ができない

 

もう一つ、前回の説明の時に普通に引き算をしましたがコンピュータは、本当は引き算が苦手です。

補数の考え方があれば足し算だけで、引き算と同じ計算ができるます。

 

125-5をやってみましょう。

補数表現の計算で言うと

125+(-5)です。

 

01111101 (10進数で125)

11111011 (10進数でー5)

 

足しますと

 

01111000 (10進数で125)

 

となります。

 

引き算が苦手なコンピュータは実際には、こういった考え方で引き算を実現しています。

 

 

 

2進数で小数を表す

 

負の数の話が長くなってしまいましたが、もう一つ、2進数で小数を表すとどうなるかについて簡単にご紹介します。

 

まずは、コンピュータでは正確には表せない小数というものが存在します。

たとえば、永遠に続く、循環小数などは表すことができません。

 

なので、コンピュータでの小数の表し方の基本的な考え方だけをここでは紹介します。

 

固定小数点形式

 

8ビットなら8ビット、16ビットなら16ビットのどこかに小数点があると仮定(固定)する考え方です。

統一した取り決めはないので、実際にはあまり使われないと思いますので、単に考え方だと理解してください。

 

たとえば、8ビットで小数点で4ビットづつ区切られていると仮定しましょう。

こんな感じです。

 

000000

 

小数点の左側(青)は10進数で「1」ですよね。

じゃ、小数点の右側(赤)の1は10進数だとどうなりますか?

答えは0.5です。

 

整数の時のご紹介したように、整数ではビットの桁があがるたびに、1->2->4->8...増えていったと思います。

逆に小数点より右側は、桁が一つ下がっていくたびに、0.5->0.25->0.125->0.0625...となっています。

 

たとえば、同じ考え方で

 

00100100

 

という2進数だと、

 

0010.0100

 

で「2.25」ということになります。

 

細かく、小数を表そうとすれば8ビットを16ビット、32ビットと増やせばいいのですが、どうしても表せない小数がでてきますね。

 

浮動小数点方式

 

実際のコンピュータでは、多くの場合、固定小数点ではなく、こちらの方式が採用されていると思っていいと思いいます。

 

また、浮動小数点方式のフォーマットはIEEEというもので決められています。

内容が難しすぎるので、考え方だけ書いておきます。

 

考え方は、ビットの並びを、仮数(仮数の)符号、仮数の絶対値、基数(1より大きい整数)、指数(符号付き整数)で使用して数字を表します。
なお、現在広く使われている表現方法では基数は固定なので、省略されます。

なので、実際には3つの符号となります。

 

符号部(1ビット)
仮数部(符号なし整数)
指数部(符号付き整数)

図で見るとこんな感じです。

 

(出典:ウィキメディア・コモンズ photo by Fresheneesz Float_example/CC by-sa 3.0)

 

そして、数値の絶対値は(仮数部)×(基数)(指数部)となります。

例として、0.5を浮動小数点数で表すと、基数が10の場合は5.0×10の-1乗、基数が2の場合は1.0×2-1乗となります。

 

元々、極端な数を扱う科学計算などの分野で用いられていましたが、プログラミング言語のほとんどが対応していることから、小数の表現方法としては最も普及しています。

 

また、整数演算と同じような処理で浮動小数点を扱うと命令が複雑になってしまうため、多くの場合は、専用の演算処理装置で計算させるようになっています。

 

このあたり、結構難しい話になっていますが、通常、パソコンを操作したり、普通にプログラミングするぐらいであれば、意識する必要のない話なのでご安心ください。

ですが、多少こういうことを理解しておくと、パソコンなどを扱う上で抵抗感が減るかなって思いますよ。

 

今日も最後までおつきあいいただき、ありがとうございました。

 

 

コメント

タイトルとURLをコピーしました