基本的な知識を復習しつつAP対策するシリーズ。
この記事ではビットで負の数や小数点を表す方法をまとめます。
固定小数点と整数
いま、8bitの二進数で数値を表すとします。
ここで、小数点の位置を「何bit目」と決め打ちすると小数を表すことができます。
このように小数点の位置を固定して小数を表現する方法を固定小数点と呼びます。
整数は「一番右に小数点を置いた固定小数点」として扱われます。
負の数の表し方
今、8bitの整数が表せる範囲について考えます。
2進数 | 10進数 |
---|---|
00000000 | 0 |
00000001 | 1 |
… | … |
11111111 | 255 |
このように8bitでは0〜255までの256段階を表すことができます。
次に、同じ8bitで負の整数まで表すことを考えます。
この場合、一番左の1bitが1であれば負、0であれば正というルールにします。
残りは7bitなので、正の整数は0〜127まで表せます。
2進数 | 10進数 |
---|---|
00000000 | 0 |
00000001 | 1 |
… | … |
01111111 | 127 |
同様に負の値は-1〜-128まで表せることになります。
2進数 | 10進数 |
---|---|
10000000 | -128 |
… | … |
11111111 | -1 |
00000000 | 0 |
00000001 | 1 |
… | … |
01111111 | 127 |
このように、負の数を表すためには一番左のビットを符号とし、8bitの場合は-128〜127の範囲が表現できます。
1の補数・2の補数
ここで1の補数と2の補数の説明をします。
今、8bitの2進数を考えます。
00110010 (50)
これの各ビットを反転します。
11001101 (-51)
このように元の値から各ビットを反転したものを1の補数と呼びます。
次に1の補数に1を足します。
11001110 (-50)
このように1の補数に1を加えたものを2の補数と呼びます。
負の値は2の補数
前節の例を見ると、元の値の2の補数は元の値の符号を負にしたものであることがわかります。
- 00110010 (50)
- 11001110 (-50)
このように、ある値の2の補数を求めると、ある値の符号を反転させたものが得られます。
バイアスをかける
さて、8bitの符号付き整数は次のように表せました。
2進数 | 10進数 |
---|---|
10000000 | -128 |
… | … |
00000000 | 0 |
… | … |
01111111 | 127 |
これは負の値が2の補数で表現できるという意味で便利ではあるのですが、
この二進数で表された値同士を比較するときに大小の比較が少しやりづらいです。
このようなときには、10進数の値に128を加えた値の二進数を求め、それを使います。
元の10進数 | +128した10進数 | ←の2進数 |
---|---|---|
-128 | 0 | 00000000 |
… | … | |
0 | 128 | 10000000 |
… | … | |
127 | 255 | 11111111 |
これにより二進数の値から簡単に大小の比較ができるようになります。
このように補正をかけることをバイアスをかけるといいます。
浮動小数点
小数をビットで表すには浮動小数点の形式を使います。
例えば、今0.625という10進数をビットで表現するとします。
まず、10進数を2進数に変換します。
0.625 (10進数) -> 0.101 (2進数)
次にこれをの形式にします。これを正規化といいます。
0.101 (2進数) -> (正規化)
ここで、小数点以下を仮数部、指数部分を指数部と呼びます。
この仮数部と指数部を次のようなビット列に格納していきます。
一番左の1bit(赤い部分)は符号です。
オレンジ色の8bitには指数部を入れます。
が、この際に+127のバイアスをかけます。
つまりこの8bitには、-1+127=126を2進数にした01111110を入れます。
最後に緑色の部分には仮数部を左詰めでそのまま入れます。
したがってこの浮動小数点は次のようなビット列で表現されます。
0 01111110 01000000000000000000000
浮動小数点の形式によりの形式だったり、
バイアスの値が異なったりはするものの、同様の手順で変換できます。
過去問
参考
過去問は下記のサイトのものを使わせていただいております。
www.ap-siken.com