矢沢 久雄
●コンピュータが2進数を使う理由
コンピュータの内部では,すべての情報(命令とデータ)が2進数の数値で取り扱われています。2進数とは,0と1だけを使って数値を表す方法です。人間の世界では0~9を使った10進数が使われますが,コンピュータの世界は2進数なのです。その理由を説明しましょう。連載の第1回で,コンピュータの構成要素であるICが数多くのピンを持った「ムカデ」のような形状をしていることを説明しました。コンピュータで使われるICは,「ディジタルIC」と呼ばれるものです。ディジタル(digital)とは,「指折り数える」という意味です。個々のピンに0または1のどちらかの電気信号しか入出力できないのが,ディジタルICの特徴です。実際には,直流電圧0V(V=ボルト)で数値の0を表し,5Vで数値の1を表しています(5V以下の電圧を使う省電力型のコンピュータもあります)。この特性から,必然的にコンピュータは2進数を使うことを余儀なくされます。
![]() |
図1●0Vと5Vの電圧が2進数の0と1を表す |
2進数で数を数えてみましょう。0の次は1です。1の次はけた上がりして10(「じゅう」ではなく「いち・ぜろ」と読む)になります。このように2まで数えるときにけた上がりするので,2進数(2で進む数)と呼ぶのです。2進数では,小さな数を表すのに多くのけた数が必要になります。例えば,8けたの2進数で表せる00000000~11111111は,10進数の0~255であり,わずか3けたの途中までとなります。このことから,コンピュータを構成するディジタルICには数多くのピンが必要になるのです。
●ビットとバイト
ディジタルICのピン1本で表せる情報が,コンピュータの情報の最小単位となります。これを「ビット(bit)」と呼びます。1ビットは2進数の1けたであり,0または1の2通りの情報しか表せず,人が用いるのは不便です。そこで,8ビットすなわち2進数の8けたを情報の基本単位とすることになっています。これを「バイト(byte)」と呼びます。1バイト=8ビットです。1バイトなら00000000~11111111の255通りの情報を表せます。この255種類の数値を文字に割り当てれば,英数記号を表すには十分です(数値で文字などの情報を表す方法に関しては,連載の第3回で説明します)。
![]() |
図2●メモリーやI/Oの中にはバイト単位の部屋がある |
プロセサの中には,演算する情報を格納するための部屋があります。この部屋のことを「レジスタ」と呼びます。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を足すと補数が求められる |
00000101-00000011(10進数では5-3)が,00000101+11111101で求められることを確かめてみましょう。00000101+11111101=100000010になります。9けたとなった答えの最上位けたは失われるので,00000010(10進数では2)になります。確かに5-3の答えになっています。
8けたの2進数00000000~11111111で表せる数の範囲は,補数を使わないなら10進数の0~255であり,補数を使うなら-128~127です。どちらの範囲を使うのかは,皆さんが記述するプログラムの書き方で簡単に区別できるようになっているので,ご安心ください。ただしプロセサは,補数かどうかを区別することなく演算を行います。それでもつじつまが合ってしまうからです。
ハードウエア的には,コンピュータの頭脳であるプロセサは,加算しかできません。減算は補数を使った加算で実現しています。乗算は,加算の繰り返しで実現しています。除算は,減算の繰り返し(すなわち補数を使った加算の繰り返し)で実現しています。プロセサは,掛け算の九九を暗記できるほど賢くないのです。コンピュータとは,実にシンプルなものですね!