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

こんにちわ。

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

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

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

割り算は、小数になったり、余りが出たりすると説明が複雑になるので上記の記事では説明を省きました。

もうひとつ、引き算についても本当はちょっと問題があります。

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

余談ですが、パソコンなどの場合、表現できるデータの大きさは16ビットとか32ビットとか、もちろん上限があります。

つまり、2進数で16桁とか32桁という意味です。

じゃ、足し算や掛け算の結果、その桁数を超えた場合はどうなるかというと。。。

もちろん、コンピュータ的には「エラー」です。

このように桁の上限から溢れることを「オーバーフロー」と言います。

今回は、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乗となります。

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

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

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

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

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

スポンサーリンク
スポンサーリンク




スポンサーリンク




シェアする

  • このエントリーをはてなブックマークに追加

フォローする