コンピュータの内部では,すべての情報(命令とデータ)が2進数の数値で取り扱われています。2進数とは,0と1だけを使って数値を表す方法です。人間の世界では0~9を使った10進数が使われますが,コンピュータの世界は2進数なのです。その理由を説明しましょう。

●コンピュータが2進数を使う理由

 連載の第1回で,コンピュータの構成要素であるICが数多くのピンを持った「ムカデ」のような形状をしていることを説明しました。コンピュータで使われるICは,「ディジタルIC」と呼ばれるものです。ディジタル(digital)とは,「指折り数える」という意味です。個々のピンに0または1のどちらかの電気信号しか入出力できないのが,ディジタルICの特徴です。実際には,直流電圧0V(V=ボルト)で数値の0を表し,5Vで数値の1を表しています(5V以下の電圧を使う省電力型のコンピュータもあります)。この特性から,必然的にコンピュータは2進数を使うことを余儀なくされます。

図1●0Vと5Vの電圧が2進数の0と1を表す
 8本のピンでデータを入出力するディジタルICがあったとしましょう。個々のピンの電圧を測定すれば,図1[拡大表示]のように0Vと5Vのいずれかになっています。0Vと5Vの羅列を数値の0と1に置き換えてください。01101010となりますね。これは8けたの2進数であり,10進数に変換すると106になります。Windowsに添付している「電卓」プログラムを使うと,2進数と10進数の変換ができるので,実際に試してみてください。

 2進数で数を数えてみましょう。0の次は1です。1の次はけた上がりして10(「じゅう」ではなく「いち・ぜろ」と読む)になります。このように2まで数えるときにけた上がりするので,2進数(2で進む数)と呼ぶのです。2進数では,小さな数を表すのに多くのけた数が必要になります。例えば,8けたの2進数で表せる0000000011111111は,10進数の0~255であり,わずか3けたの途中までとなります。このことから,コンピュータを構成するディジタルICには数多くのピンが必要になるのです。

●ビットとバイト

 ディジタルICのピン1本で表せる情報が,コンピュータの情報の最小単位となります。これを「ビット(bit)」と呼びます。1ビットは2進数の1けたであり,0または1の2通りの情報しか表せず,人が用いるのは不便です。そこで,8ビットすなわち2進数の8けたを情報の基本単位とすることになっています。これを「バイト(byte)」と呼びます。1バイト=8ビットです。1バイトなら0000000011111111の255通りの情報を表せます。この255種類の数値を文字に割り当てれば,英数記号を表すには十分です(数値で文字などの情報を表す方法に関しては,連載の第3回で説明します)。

図2●メモリーやI/Oの中にはバイト単位の部屋がある
 皆さんがお使いのPCに装備されているメモリーは,バイト単位で情報を記録するのが一般的です。だからこそ,メモリーの記憶容量を64MBや256MBのようにバイト(B=byteの略)で表すのです。メモリーの中には1バイトごとの部屋がたくさんあり,それぞれに部屋番号が付けられていると考えてください。数は少ないのですが,I/Oの中にも情報を一時的に格納しておく部屋があり,それらに部屋番号が付けられています。この部屋番号はアドレスと呼ばれます。プロセサは,アドレスを指定してメモリーやI/Oの中の部屋を特定し,情報の授受を行います。アドレスは,0号室,1号室,…ではなく,0番地,1番地,…と呼びます。メモリーとI/Oに同じアドレスが割り振られていても,プロセサの動作制御ピンで両者を区別できるようになっています(図2[拡大表示])。

 プロセサの中には,演算する情報を格納するための部屋があります。この部屋のことを「レジスタ」と呼びます。1つのレジスタに格納できる情報のサイズは,プロセサの種類によって異なります。皆さんがお使いのPCが搭載しているPentiumプロセサが持つレジスタのサイズは,1つあたり32ビット=4バイトです。そのためPentiumプロセサは,32ビット・プロセサと呼ばれます。ゲーム機であるNINTENDO 64のプロセサは,64ビットのサイズのレジスタを持っています。大きなサイズのレジスタを持つプロセサほど,同時に演算できる情報のサイズ(けた数)が大きくなり,プログラムの実行速度が速くなります。

●マイナスの数をプラスで表す補数の不思議

 0と1だけを使う2進数では,けた数が多くなっても10進数と同様に数を数えられます。ただし,ちょっと問題があります。それはマイナスの数が表せないということです。この意味が分かるでしょうか? 10進数では,0~9だけでなくマイナス符号(-)も使われます。0と1しか使えず,それらで数を数えるコンピュータには,マイナス符号を表す手段がありません。困りましたね。

 そこで,「プラスの数でマイナスの数を表す」という驚くべき手法が使われています。これは,ICのピンの数には限りがあるので,けたあふれした数は失われるという性質を上手く利用した手法で,「補数表現」と呼ばれています。

 補数表現のイメージをつかんでいただくために,まず人間の世界の10進数でマイナスの数をプラスの数で表してみましょう。例えば5-3の答えは2ですね。これは,5+7=12のけた上がりを無視した結果に一致します。すなわちけた上がりが無視されるなら,-3というマイナスの数は7というプラスの数で表せることになります。したがって,7は-3の補数表現です。単に「7は-3の補数だ」とも言います。

図3●反転して1を足すと補数が求められる
 これと同じことを8けたの2進数でやってみましょう。0000010100000011(10進数の5-3)を計算するなら,00000101+(00000011の補数)とすればよいのです。補数は,もとの数の0を1に,1を0に反転した数より1だけ大きい値になります。なぜなら,10進数の7と-3の関係でも分かるように,補数とは加算してちょうどけた上がりする数のことだからです。7+3=10ですね。2進数の00000011と,それを反転した11111100を加えると,けた上がりの1つ前の11111111になります。したがって,00000011とそれを反転した数より1つ大きい値(11111100+1=11111101)を加えれば,100000000の9けたなります。8けたのサイズで計算を行っているのですから,9けた目は無視されて00000000になります。すなわち00000011に加算すると,ちょうどけた上がりする数は11111101であり,これは-00000011をプラスで表した補数表現でなのです。このように補数を求める手順を「反転して1を足す」と覚えてください(図3[拡大表示])。

 0000010100000011(10進数では5-3)が,0000010111111101で求められることを確かめてみましょう。0000010111111101100000010になります。9けたとなった答えの最上位けたは失われるので,00000010(10進数では2)になります。確かに5-3の答えになっています。

 8けたの2進数0000000011111111で表せる数の範囲は,補数を使わないなら10進数の0~255であり,補数を使うなら-128~127です。どちらの範囲を使うのかは,皆さんが記述するプログラムの書き方で簡単に区別できるようになっているので,ご安心ください。ただしプロセサは,補数かどうかを区別することなく演算を行います。それでもつじつまが合ってしまうからです。

 ハードウエア的には,コンピュータの頭脳であるプロセサは,加算しかできません。減算は補数を使った加算で実現しています。乗算は,加算の繰り返しで実現しています。除算は,減算の繰り返し(すなわち補数を使った加算の繰り返し)で実現しています。プロセサは,掛け算の九九を暗記できるほど賢くないのです。コンピュータとは,実にシンプルなものですね!