コンピュータが数を入れる箱は、桁数が決まっています。 8ビットなら 0 と 1 が8個で、マイナスの記号を書く場所はありません。 それでも引き算はできます。この回では、負の数の作り方(2の補数)と、 小数がどう表されるかを確かめます。
出典:基本情報技術者試験 シラバス Ver9.2 大分類1 基礎理論/中分類1 基礎理論/1. 離散数学
(2)数値の表現
負の数の表現(補数表現),小数の表現を理解する。
用語例
固定小数点数,単精度浮動小数点数,倍精度浮動小数点数,仮数,指数,BCD(Binary Coded Decimal:2 進化10 進),パック10 進数
負の数を入れる場所がない
8ビットの箱には、0 と 1 が8個しか並びません。 素直に考えると「左端の1ビットを符号にする」やり方が浮かびます。 0 ならプラス、1 ならマイナス、という決め方で、この1ビットを符号ビットといいます。ところが、これには具合の悪いところが2つあります。
左端を符号にすると困ること
0 が2つできる … 0000 0000(+0)と 1000 0000(−0)が別の並びになる
引き算の回路が別に要る … 足し算とは別の手順で計算しなければならない
そこで使うのが2の補数で、これを使うと引き算がそのまま足し算になります。 回路が1つで済むので、いまのコンピュータはこの表し方を使っています。
2の補数の作り方 ── 反転して、1 を足す
ある数のマイナスを作る手順は2つだけです。すべてのビットを反転(0 を 1 に、1 を 0 に)して、1 を足す。 2進数の足し算は、1 + 1 が桁上がりして 10 になる点だけ10進数と違います。 8ビットで −5 を作ってみます。
5 は 0000 0101 すべて反転 1111 1010 1 を足す 1111 1011 ← これが −5
正しく作れたかは、縦に足して確かめます。
0000 0101 5 + 1111 1011 −5 ───────────── 1 0000 0000 ← 左へはみ出した 1 が9桁目
9桁目は8ビットの箱に入らないので捨てます。残るのは 0000 0000=0。足して 0 になれば、マイナスとして正しく作れています。
確かめ算に注目してください。5 と −5 を足すと 0 になりました。 これが「マイナスとして正しい」ことの意味です。足して 0 になる相手を、その数の補数と呼びます。
⚠️ 8ビットの箱で表せるのは −128 〜 127 です。 左端が 1 の並びはすべて負の数を表すので、正の数として使えるのは 127 までになります。
練習
8ビットの2の補数で −6 を表すと、どれですか。
引き算が足し算になる
12 − 5 を計算します。引き算のかわりに、12 に −5 を足します。
0000 1100 12 + 1111 1011 −5 ───────────── 1 0000 0111 ← 9桁目は捨てる
残るのは 0000 0111=7。12 − 5 = 7 と一致します。
引き算の手順は要らず、マイナスを作って足すだけで答えが出ます。
2の補数の使い方
- 引く数のマイナスを作る。すべて反転して、1 を足します。元の数の桁数(8ビットなら8桁)のまま作ります。
- 足す。ふつうの2進数の足し算です。
- 決めた桁からあふれた分は捨てる。8ビットなら9桁目は無視します。箱に入らないからです。
- 左端が 1 なら、答えは負の数。いくつなのかを読むときは、もう一度反転して 1 を足します。出てきた数にマイナスを付けたものが答えです。
最後の「読むときはもう一度2の補数を取る」を忘れると、1111 1011 を 251 と読んでしまいます。同じ並びが、決め方しだいで 251 にも −5 にもなります。
練習
8ビットの2の補数として、1111 0000 はどの数を表しますか。
小数は、小数点の右も重みで決まる
小数も考え方は同じです。小数点の右へ動くたびに、重みが半分になります。 2進数の 11.01 を10進数にします。
| 位 | 2 | 1 | 小数点 | 1/2 | 1/4 |
|---|---|---|---|---|---|
| 2進数 11.01 | 1 | 1 | . | 0 | 1 |
| この位が表す数 | 2 | 1 | 点の位置 | 0 | 0.25 |
2 + 1 + 0 + 0.25 = 3.25
小数点の右は 1/2、1/4、1/8 と、半分ずつ小さくなっていきます。
先に、ひとつ予想してみましょう
2進数の 1011.01 は、10進数でいくつですか。
ここで問題になるのが、小数点をどこに置くかです。置き方が2つあり、どちらも点そのものは記録しません。
| 表し方 | 小数点の位置の決め方 | 向いている場面 |
|---|---|---|
| 固定小数点数 | 「下位4ビットは小数部」のように先に決めておく。並びの中に点は持たない | 扱う桁数が決まっている計算。金額など |
| 浮動小数点数 | 数字の並びと、点を動かす量を別々に持つ | けた違いに大きい数・小さい数も同じ形で扱いたいとき |
浮動小数点数では、数字の並びを仮数、点を動かす量を指数といいます。 10進数で 3,200 を 3.2×10³ と書くのと同じで、仮数が 3.2、指数が 3 にあたります。2進数では 仮数 × 2 の 指数 乗 です。 ビット数を多く使って精度を上げたものを倍精度(一般に64ビット)、少ないほうを単精度(同32ビット)と呼びます。
⚠️ 10進数を1桁ずつ4ビットの2進数で持つ表し方もあります。BCD(2進化10進)で、 これを詰めて格納したものがパック10進数です。金額のように10進数のまま扱いたい場面で使われます。
まとめ
この回で持ち帰ること
1. 負の数は2の補数で表す。作り方はすべて反転して 1 を足す
2. 正しく作れたかは足して 0 になるかで確かめる(あふれた桁は捨てる)
3. 引き算はマイナスを作って足す。左端が 1 なら答えは負の数で、読むにはもう一度2の補数を取る
4. 小数点の右の重みは 1/2、1/4 と半分ずつ。小数点を固定するのが固定小数点数、指数で動かすのが浮動小数点数
次に読む
この記事で引用した資料
いずれも独立行政法人情報処理推進機構(IPA)が公表したものです。IPAは公表済みの試験問題について、教育目的での使用に許諾および使用料を不要としていますが、著作権は放棄していません。本記事では問題文を改変せずに引用しています。
本文の例(5・6・12 などの8ビット表現、1011.01)と練習問題は、すべて当サイトが説明のために作ったものです。

