5.1 コンピューターで2進数が使われる理由
人間の指は10本あることは、よく知られている。そのため、人類は10進法を使っていると
言われている。小学校の低学年では指を使って計算する子供がいることからも分かる。コ
ンピューターの内部のハードウェアーでは、電圧が0Vか5V(もっと低い場合もある)でデー
タやプログラムを表現している。指が2本しかないのと同じ。だから、コンピューターは2
進法を使う。2進法を使うメリットに、何があるか? という疑問が湧くであろう。その答
えとして、以下のようなことが考えられる。
- ノイズに強い
0〜5Vで動作する素子からできたコンピューターを考える。2ビットと10ビット
の場合、割り当てられる電圧のレベルは、図5の通りであ
る。図からも分かるように、許されるノイズは、2ビットの方が格段に大きく
なる。1ビットのエラーも許されないデジタルコンピューターにおいては、こ
の差は非常に大きい。
- ハードウェアーを実現するのが容易
コンピューター内部には、単純な動作をする同じような部品が数多くある。2進数であれ
ば、入力は0と1、出力も0と1なので、構成する1個の部品が非常に単純になる。要するに
2進数を採用すると、部品が簡単になるのである。
- 演算が簡単
例えば、掛け算九九を考えると分かる。10進数だと、0〜9までの掛け算、合計100通りあ
る。2進数だと、4通りで済む。
- ブール代数が使えて、論理演算が容易
ブール代数については、他の授業で勉強することになっている。それまで待て
ない人は、私の講義ノートでも見ろ。
図 5:
2進法と10進法のコンピューターのノイズレベル
|
これは少しレベルの高い内容で、もう少し時間をかけないと説明できない。2年前、私が2
年生で他の教科を教えていたときには、ここまで
講義した。従って、諸君が理解できない
わけはない。将来、情報関係の仕事に就きたい者、あるいは自分の能力に自信のある者は
独力で以下の内容を理解せよ。非常におもしろい内容であるはずである。
負の整数は、補数(complement)を使って、コンピューター内部では表現される。それを図
6に示すが、手順は、次の通りである。
- 絶対値を2進数のビットパターンで表現し、その反転を行う。
- 反転されたビットパターンに1を加算する。
このようにしてできたビットパターンをメモリーに記憶させ、それを負の数として取り扱
う。
この方法のメリットは、減算が加算器でできることである。補数表現のイメージは、
図
7の通りです。車の距離計に似ている。
それでは、なぜ、補数表現だと、減算が加算器で可能なのだろうか?。減算の演算は、負
の数の加算と同じである。したがって、図7のように負の数を
表現すると、負の整数の加算は正の整数の加算と同じと分かるであろう。したがって、加
算器で減算が可能となる。実際、正の数の減算を行うときは、ビットの反転と+1加算を実
施して、加算器で計算する。イメージは、図7の通りであるが、
もう少し、理論的に説明をおこなうとしよう。ある正の整数をxとする。その負の数、-x
は補数表現では、
|
(12) |
となる。左辺の
が
の意味である。
の意味は、括弧内の負の整数を計
算機内部の表現を表している。これは、私が作った表記なので、一般には用いられていな
い。右辺の
がビット反転になっている。ここでは、16ビットで整数を表現しよう
としているので、
から
を引いてビット反転させている。疑問に思う者は実際に
計算して見よ。それに1を加えて、補数の表現としている。つぎに、ある整数
を考えて、
y-xを計算してみよう。
は、あらかじめ計算されて、コンピューター内部のメモリーに格納されている
ので、
は加算器で可能である。これは、あたりまえです。重要なことは、この結
果が、負の場合、2の補数表現になっており、正の場合、そのままの値になっていること
である。
演算の結果、y-xが負になる場合を考えよう。すると式(13)は、
|
(14) |
と変形できる。この場合、絶対値が
なので、絶対値のビット反転と+1加算となっ
ていることが理解できる。つぎに、
が正になる場合を考えましょう。すると式(
13)は、
となる。10000は計算機内部では、桁上がりを示す。16ビットの表示では無視される。し
たがって、内部の表現は、正しく表せる。
コーヒーブレイク |
---|
この方法で負の数を表すことは、1970年頃には常識となったようです。驚いたことに、負
の数をこの補数で表すアイディアは、パスカルが最初です。パスカルは、パスカリーヌと
いう歯車式計算機を1642年頃に製作しています。そこの減算を加算器で行うために、補数
というものを考えたようです。
|
浮動小数点表示とは、指数化(例えば、
)して数値を表現する。
これは非常に便利な方法で、自然科学では多くつかわれる。コンピューターでも同様で、
データが整数と指定されない限りこの浮動小数点が用いられる。実際、この仮数部の
(-0.123)と指数の(-2)をメモリーに格納する。この方法の長所と短所は、以下の通りであ
る。
- 長所
- 決められたビット数内で、非常に小さな数値から大きな数値まで表現可能になる。
- 短所
- 桁落ち誤差が発生する場合がある。
浮動小数点表示を学習するために、必要な言葉の意味は、図
8の
通りである。1年生の数学の授業で学習したはず。
IEEEの規格のC言語の倍精度実数型のdoubleの表現について説明する。まず、浮動小数点
表示のための正規化を図5に示す。当然、仮数部、指数部とも2進数表現です。仮数部は、
符号と1.XXXXのように表す。
つぎに、これをIEEE規格の浮動小数点に表すことを考える。まずその規格の仕様は、以下
のようになっている。
- 64ビット(第0ビット〜第63ビット)で、浮動小数を表わす。各ビットの構成は、図
10の通りである。
- 最上位の第63ビットが仮数部の符号ビットである。正の場合ゼロで、負の場合1に
なる。
- 指数は11ビットでオフセットバイナリ方式で表す。11ビットで0〜2047の値に
なる。ただし、指数部11ビットの値0と2047は例外処理のために予約されてい
る。11ビットで表現される値からオフセット値1023を引くことにより指数の値が
-1022〜1023の範囲になるように定められている。
- 仮数部は52ビットである。小数点以下を、絶対値で表現する。規格化のための整数
部は1と分かっているので、このためのビットは割り当てられていない。
図 10:
IEEE規格(C言語の倍精度実数)表現のビットの内訳
|
以上の仕様をもとに、図9で規格化された数を浮動小数点表示を
示す。ほとんどの部分は規格化で分かるが、指数のみ計算が必要である。指数は、オフセッ
トバイナリーで計算するために、まず10進数で表す。
|
(16) |
不動小数表示の指数は、この式の値に 1023 を加算して求める。すると、
|
(17) |
となる。
これで、すべて準備が整った。不動小数点表示は、図11のようにな
る。実際のコンピューターには、この64ビットのデータが格納される。メモリーは8ビッ
ト(1バイト)毎アドレスが割り当てられているので、8番地分のデータ領域が必要である。
ここまで、書く時間が無かった。興味のある者は、自分で調べよ。私の
以前の講義ノート
にも書いてある。
ホームページ:
Yamamoto's laboratory著者:
山本昌志
Yamamoto Masashi
平成17年6月6日