矢沢 久雄

 この講座のテーマは,2進数,浮動小数点数,BCDなどの「データ表現」です。皆さんは「そんなこと,分かりきっているよ!」と思われるかもしれませんが,はたしてそうでしょうか。小数点以下の2進数を10進数に変換できますか。「けた落ち」が生じる原因と,その対策を説明できますか。なかなか,自信を持って「できる」と言える人は少ないでしょう。データ表現は,コンピュータを取り扱う上で,基本中の基本となるものです。

 信じられないことかもしれませんが,コンピュータを使っていると,数値が突然プラスからマイナスに変わってしまったり,誤差が生じて思い通りの計算結果が得られないことがあります。データ表現を知っていれば,このような問題に遭遇しても,原因を究明して適切な対策を施すことができるのです。16進数のダンプ・リストを見たときに,それが10進数でいくつなのかも瞬時に判断できるようになります。コンピュータを使っているなら,データ表現の知識は必要不可欠なものなのです。この機会に,あらためて皆さんの知識を整理してみましょう。

クイズ

 いきなりですが,これから2問ほどクイズを出題させていただきます。これらは,2001年春の基本情報処理技術者試験(旧:第二種情報処理技術者試験)に出題された問題の中から抜粋し,筆者が若干のアレンジを加えたものです。このクイズで,データ表現に関する皆さんの知識を確認してみましょう。解答は,このページの末尾に掲載してあります。

問1 2進数の0110.1100を10進数で表したものはどれか?

ア 6.11
イ 6.3
ウ 6.55
エ 6.75

問2 ある整数値を、負数を2の補数で表現する2進数記法で表すと、最下位3ビットは“101”であった。10進数表記法のもとで、その整数値を8で割ったときのあまりに関する記述として、正しいものはどれか。ここで、除算の商は、絶対値の端数が切り捨てられるものとする。

ア その整数値が正であれば5
イ その整数値が負であれば5
ウ その整数値が負であれば-5
エ その整数値の正負に関わらず0

 いかがだったでしょう。もしも,解けない問題があっても心配しないでください。この講座に最後までお付き合いいただければ,必ず解けるようになります。

 皆さんは,「コンピュータは,内部的に2進数でデータを取り扱っている」とか,「2進数は,0と1だけですべての数値を表す」といったことは,ご存知でしょう。しかし,Microsoft Excelのようなアプリケーションを使う場合でも,Visual Basicなどのプログラミング言語を使う場合でも,直接2進数に触れる機会はないはずです。人間が使い慣れた10進数で用が足ります。しかし,それでは,自動車の運転はできても内部の構造が分からないのと同じです。旅先で自動車が故障したらお手上げですね。これと同様に,2進数の仕組みを知っていないと,いざコンピュータがおかしな動作をしたときにお手上げになってしまいます。IT業界にいるなら「転ばぬ先の杖」として,2進数をベースとしたコンピュータのデータ表現の基礎をマスターしておきましょう。

コンピュータはなぜ2進数を使うのか?

 コンピュータが2進数を使うことには,必然性があります。ハードウエア的に見れば,コンピュータが,IC(Integrated Circuit,集積回路)と呼ばれる電子部品の集合体であることをご存知ですね。PentiumなどのCPU(プロセッサ)も,数100Mバイト実装されたメイン・メモリーも,その実体はICです。ICの構造上,コンピュータは2進数を使うことになるのです。

図1●デジタルICの外観
 ICは,四角いボディーの側面にピンが並んだムカデのような形状や,ボティーの裏にピンが並んだ剣山のような形状をしています(図1)。このピンには,もちろん電気を与えます。数あるピンの中の数本は,IC自体が動作するための電源を与えるためのものです。それ以外のピンは,IC同士がお互いに信号をやり取りするためのものです。この信号は,電圧の有無で伝えるようになっています。多くの場合に,直流電圧+5V(電圧あり)と0V(電圧なし)の2通りだけの電圧が使われます。コンピュータは,+5Vを数字の1,0Vを数字の0とみなし,ICのピン1本で2進数の1けたを表しているのです。データ入出力のために8本のピンを使うICなら,同時に8けたの2進数を取り扱えることになります。

 「デジタル」という言葉を聞いたことがあるでしょう。デジタル(digital)とは,「指折り数える」という意味です。コンピュータの内部で使われているICのことを,特に「デジタルIC」と呼ぶことがあります。これは,ICのピン1本1本が指折り数える機能を持っていることを意味しています。指を曲げた状態が0で,指を立てた状態が1だと考えてください。実際には,ICのピンが折り曲がって動作するわけではなく,電圧の有無が指の折り曲げ状態に相当します。デジタルだから2進数なのだと考えてください。

 もしも,ICのピン1本で,0V,+1V,+2V,…,+9Vの10通りの電圧を取り扱えたなら,コンピュータが直接10進数を使えるでしょう。しかし,それはできません。ICの内部は,数十~数百万個のトランジスタと呼ばれる素子から構成されています。トランジスタは,スイッチの役割をします。スイッチONとスイッチOFFです。これが,ICのピンの電圧の有無を生み出すものとなります。2進数の必然性を理解していただけましたか。

ビットとバイト

 「いまさら,そんな話は聞きたくな~い」と言われてしまいそうですが,話の流れですので,ビットとバイトの説明をさせていただきます。2進数の1けたを1ビットと呼びます。ビット(bit)とは,「破片」という意味です。2進数の1けたが,情報の破片=情報の最小単位というわけです。これは,言い得て妙ですね。1進数というものはあり得ません。1進数では,0という数字だけを使うことになるので,どんなにけた数を増やしても0しか表せないからです。○○進数というものは,2進数が最小であり,2進数の最小けたである1けた,すなわち1ビットが情報の最小単位になります。

 1ビットで表せる情報は,0と1の2通りです。これで用が足りる場合もあります。例えば,物事の真偽(True/False),答案の○×,スイッチのON/OFFなどです。ただし,たった2通りの情報を取り扱うためにコンピュータを使う人はいません。コンピュータは,数値の計算ができなければなりません。それでは,何けた(何ビット)の2進数があればよいのでしょう?

 1ビットなら2通り,2ビットなら4通り,3ビットなら8通り,4ビットなら16通り…そうです! 4ビットあれば,16通りの情報が表せるので,10進数の0~9をコンピュータで取り扱え,計算ができます。事実,電卓用に開発された世界最初のCPU(単体のプロセッサ)である4004は,4ビットを取り扱うものでした(4004の開発者は,日本人の嶋正利氏です。4004のことは,嶋氏の著書である「マイクロコンピュータの誕生-わが青春の4004,岩波書店」に詳しく書いてあります)。4ビットのことを「ニブル」と呼ぶこともおぼえておいてください。ニブル(nibble)とは,「ひとつまみ」という意味です。これまた,言い得て妙ですね。

 さて,コンピュータで取り扱うデータが数字だけならニブルが情報の基本単位でよかったのですが,実際には文字も取り扱わなければなりません。コンピュータを発明したのは,タイプライタを使う国の人たちだったので,タイプライタのキーに刻印されたすべての文字を表せる8ビットの2進数(=256通りの情報)を情報の基本単位とすることになりました。これがご存知「バイト」です。バイト(byte)の意味を英和辞典で調べると,コンピュータ用語としてのバイトとしか示されていません。byte≒bite(かじる)をもじってバイト(ひとかじり)なのだと聞いたことがあるのですが,正しい語源をご存知の方は,この講座のご意欄に書き込みをお願いします。

図2●ビット,ニブル,バイトの関係
 図2[拡大表示]に,ビット,ニブル,バイトの関係をまとめておきます。ビットとバイトだけではなく,ニブル単位,すなわち4ビット単位でデータを取り扱うことも重要だということが,今後の講座の中で分かるでしょう。

2進数から10進数への変換

 皆さんは,2進数で表された数値を10進数に変換することが得意でしょうか? 変換手順を丸暗記しているなんてのはダメですよ。応用が利きませんから。ここでは,「そもそも○○進数とは何か」ということを説明しますので,2進数から10進数への変換手順を自ら導き出せるようになってください。

 たとえ話を使って,皆さんがお使いの10進数とは何かを説明しましょう。遠い宇宙の彼方からやって来た宇宙人が,「地球人が使っている数を教えてください」と言ったとしましょう。皆さんは,人間の手の指が10本なので,10を基本として数を考えることや,0~9という記号を使って数を表すことを説明します。宇宙人は,興味津々です。皆さんが,紙の上に「789」と書いて見せたところ,宇宙人は不思議そうな顔をしました。

宇宙人:7ト8ト9ヲ・ナラベテ・カクノハ・ナゼデスカ?
皆さん:7は700,8は80,9は9を表しています
宇宙人:ナルホド!0~9マデノ・キゴウ・シカ・ナイノデ・9ノツギハ・ケタアガリ・スルノ・デスネ.ソレデハ・7ト8ト9デ・イクツ・デスカ?
皆さん:789(ななひゃく・はちじゅう・きゅう)です。100が7個,10が8個,1が9個です。
宇宙人:ワカリマシタ!789=100×7+10×8+1×9・トイウ・コトデスネ
皆さん:そうです,そうです。宇宙人さん,頭い~い!

図3●10進数の仕組み
 いかがでしょう。これは,メチャクチャな話じゃないですよ。普段あまり意識したことがないかもしれませんが,789という10進数は,700+80+9を表しているのです。より正確に言えば,7×102+8×101+9×100です(あらゆる数の0乗は1です)。このとき,それぞれのけたの数字に掛けている10を「基数」と呼びます。10進数の基数は10です。基数の指数部の値は,1けた目を0乗として,けたが上がるごとに1つずつ増えていきます。789の7は,単なる7ではなく7×102であるわけですが,このとき7に掛けられている102を「重み」と呼びます。10進数の桁のけたみは,10のべき乗になります。当たり前のようですが,これが10進数の仕組みです(図3)。

図4●2進数の仕組み
 基数と重みの考え方は,2進数でも同じです。2進数の基数は2です。2進数の各桁に示された数値(0または1)は,「その数×2桁数-1」を表しています。2進数の全体の値は,それぞれの桁の値を加算したものです。例えば,1011という2進数は,1×233+0×22+1×21+1×20を表しているのです(図4)。

 「2進数の1011→1×23+0×22+1×21+1×20→10進数の11」であることがわかりますね。ただし,最終的に11(じゅう・いち)という値が得られたのは,人間が慣れ親しんだ10進数に変換したからです。もしも,0~Fまでの記号を使う16進数しか使えない宇宙人がいたら,1×23+0×22+1×21+1×20の計算結果をB(16進数のBは,10進数の11です)だと言うでしょう。2進数しか使えない宇宙人がいたら,1×23+0×22+1×21+1×20の計算結果は,1011(いち・ぜろ・いち・いち)のままです。皆さんも誰かに説明するつもりになって,理屈をブツブツ言いながら,2進数から10進数への変換をやってみてください。「なんだ簡単じゃないか,変換方法を丸暗記する必要などないや」と思われることでしょう。

 2進数を10進数に変換できるのですから,10進数を2進数に変換することもできます。それなら,普段お使いの10進数のあらゆる数値を,簡単に2進数で表せると思うでしょう。ところが,それほど現実は甘くないのです。確かに,10進数で使われる0~9という数値は,2進数の0~1001で表せます。0~100なら0~1100100です。ところが,数値にはマイナス記号や小数点も使われます。2進数の0と1だけを使ったのでは,マイナス記号や小数点を表せません。2進数でも-1011.0101などと書けばよいと思われるかもしれませんが,それは紙の上の話です。デジタルICには,マイナス記号や小数点を表す電圧がありません。どうすればよいのでしょうか? 次回と次々回の講座で説明します。お楽しみに!

【今後の予定】
第2回 補数表現と符号拡張
第3回 小数点数を表す方法
第4回 TrueとFalseの世界
第5回 誤差の原因と対策

クイズの解答:
問1 エ
問2 ア