WisdomSoft - for your serial experiences.

1.3 データ表現

コンピュータの世界では、電気的なオンとオフの 2 通りの状態を重ねた 2 進法であらゆる情報が表現されています。ここでは 2 進法や負数表現に用いられる補数について説明します。

1.3.1 基数

情報科学の基礎は、2進数と16進数等のデータ表現や論理演算にあります。特に2進数と16進数を理解していなければ、C言語を十分に理解することができないため、この場では10進数を2進数や16進数に変換する方法など、情報の基礎理論について学習します。

私たち人間が使っている数字は10進数と呼ばれています。10進数は 0 ~ 9 までの数字を使った 10 個の記号から成り立っています。この10進数を用いて数を数えることを10進法と呼び、位が上がる対象の数値 10 のことを基数と呼びます。これは多くの現代人が小学生のころから当たり前のように教えられているため、10進法を用いることが常識となっていますが、世界人類が必ずしも10進法を用いているわけではありませんし、人類が最初から10個の記号で数を数えていたわけでもありません。

ニューギニアの一部の原住民は、体の一部を数字に対応させて数える方法を用いていますし、北海道のアイヌ民族やローマ数字は5進法と10進法を混合させた数字を使っています。このように、多くの数字は 5 や 10 を基準に区切られているという特徴が見られます。バビロニアやエジプトの数字も10個集まると記号が変化する仕組みを持っていました。これは、子供が指を使って数を数えるように、昔の原始人が指を使って勘定していたからだと考えられます。私たちが使っている 0 , 1 , 2 , 3 ~ 8 , 9 という記号はインドが発祥の地です。ここで初めて 0 という概念が生まれ、これがアラビアに伝わり、その後にヨーロッパ各地に伝えられたと考えられています。

さて、これが私たちが日常で使っている数字の生い立ちですが、コンピュータの数字の解析方法は、人間のそれとはまったく違います。少なくともコンピュータは10本の指を持っていません。つまり、コンピュータが数を数える場合、10進法では都合が悪いのです。

そこで、コンピュータは数を電圧の違いで判断する方法を用いています。電圧が高ければ 1、そうでなければ 0 という具合です。すなわち、コンピュータが扱える記号は 0 と 1 だけであり、この 2 つの記号を用いた数を2進数と呼ぶのです。2進数は 1 桁につき 1 までしか数えられないため 2n ごとに位が上がります。これは n 桁目の2進数の値が 2(n - 1) であることを意味しています。

表1 10進数と2進数
10進数 2進数
0 0
1 1
2 10
3 11
4 100
5 101
6 110
7 111
8 1000
9 1001

このように、10進数は 0 と 1 だけを使った2進数に変換して表現することができ、デジタルデータは2進数で表現されています。しかし、表 1-3-1 を見てわかるように、2進数は桁が多くなるため人間には読み取りが困難です。そこで、人間がデジタルデータを直接扱うような場合は16進数を使うのが通例です。2進数値を他の基数に変換して表現する場合、4進数、8進数、16進数のいずれかを使います。4進数は 3 以上になると位があがり、8進数は 7 以上になると位が上がります。

しかし、16進数の場合は数字だけでは表現しきれないため、9 以降は A ~ F までのアルファベットで表現します。

表2 様々な基数
10進数 2進数 4進数 8進数 16進数
0 0 0 0 0
1 1 1 1 1
2 10 2 2 2
3 11 3 3 3
4 100 10 4 4
5 101 11 5 5
6 110 12 6 6
7 111 13 7 7
8 1000 100 10 8
9 1001 101 11 9
10 1010 102 12 A
11 1011 103 13 B
12 1100 110 14 C
13 1101 111 15 D
14 1110 112 16 E
15 1111 113 17 F

表2は、2、4、8、16 を基数とした数値の関係を表しています。コンピュータ内部のデジタルデータの本質は2進数ですが、プログラミング言語やバイナリエディタ(デジタルデータを直接編集することができるソフトウェア)などでは、16進数を使って表現します。

1.3.2 負数表現と補数

2進数だけですべてが表現される世界には符号が存在しません。そこで、デジタルに負数を表現するために使われるのが補数です。補数は2種類に分けられ、加算すると一つ多い桁の最小値になる値を真補数、その桁の範囲で最大値となる数を擬補数と呼びます。10進数で考えた場合 4 の10の補数は6(4 + 6 = 10)であり、9の補数は5(4 + 5 = 9)となります。

2進数において考えられる補数は 1の補数(擬補数)と2の補数(真補数)です。1の補数の場合、足して1になる数は0であれば1、1であれば0なので、単純に各桁を反転させればよいということになります。2の補数の場合は足して1桁上の最小値となる数を考えます。例えば2進数 1010の2の補数は0110となります。2の補数を求める簡単な方法としては、1の補数に1を加算すればよいでしょう。

1100 1010 の1の補数 = 0011 0101 (1100 1010 + 0011 0101 = 11111111)

0110 1101 の2の補数 = 1001 0011 (0110 1101 + 1001 0011 = 100000000)

2進数では、2の補数を使って負を表現することができます。まず、負数を表すためにビット列の最上位ビットを符号用に使います。最上位ビットが1であれば負数、0であれば正数であることを示しています。正数の場合は残りのビットをそのまま計算することができますが、負数であった場合は残りのビットの2の補数が絶対値となります。

1111 1100 という8ビットの列を想定した場合、最上位ビットが 1 なので負数だと判断することができます。あとは残りの7ビットの2の補数を求めればよいので 000 0100 すなわち -4 であることがわかります。2の補数を使った負数表現は、減算処理を加算処理で行うことができることを表しています。2の補数による負数表現は情報理論の基礎であり C 言語を学ぶ上でも重要です。