矢沢 久雄

●何でも数値で表すコンピュータ

 第1回,第2回の連載を読んで「コンピュータのハードウエアは,ディジタルICで構成されていて,情報を2進数で取り扱っている」ことを理解していただいた皆さんなら,「コンピュータがすべての情報を数値として取り扱っている」ということも納得していただけるでしょう。コンピュータが取り扱う情報とは,コンピュータを動作させる命令と,命令の対象となるデータのことです。数値で表された命令は,「マシン語」または「ネイティブ・コード」と呼ばれます。これに関しては,連載の第4回で説明します。今回のテーマは,数値で表されたデータです。

 コンピュータで123+456の演算結果を求めるなら,123と456という数値と,その結果である579という数値を取り扱うだけです。ところが,コンピュータを使う人間は,数値以外のデータである文字,色,味覚などもコンピュータで取り扱いたいと考えることもあります。そのためには,文字,色,音など,本来なら数値でないデータを数値で表す「符号化(コード化)」という工夫が必要になります。符号(コード)とは,数値化されたデータのことです。

 符号化は,コンピュータを使う皆さんが自由に行っていい場合と,あらかじめ決められた符号化のルールに従わなければならない場合があります。例えば,味覚を表すデータなら,皆さんが自由に符号化してかまいません。コンピュータに接続される周辺機器に,味覚を取り扱うものはないからです(もしも,そのような周辺機器が存在したとしても,一般的ではないでしょう)。それに対して,文字や色を表すデータは,あらかじめ定められた符号に従わなければなりません。キーボードやプリンタなどの周辺装置は,特定のルールで符号化された文字(文字コード)を取り扱います。ディスプレイやカラー・プリンタなどの周辺装置は,特定のルールで符号化された色(色コード)を取り扱います。皆さんが自分勝手に定めた符号では,これらの周辺装置が正しく動作しないのです。

表1●味覚コードの案(その1)
 ただし,味覚のように,皆さんが自由に符号化できるデータであっても,それなりの工夫が必要です。「あまい」,「からい」,「しょっぱい」,「すっぱい」,「にがい」の5種類の味覚を,表1のように符号化したとしましょう。ここでは,8ビット(2進数で8けた)の数値を使っています。

 ここでは,「あまい」~「にがい」を連続した2進数の値で符号化しています。「あまい」と「からい」を組み合せて「あまからい」という味覚を表したいとします。何でも数値で表すコンピュータなのですから,数値の加算で実現したいですね。「あまい」+「からい」=000000010000001000000011となります。加算結果の00000011は,「しょっぱい」を表す味覚コードです。「あまい」+「からい」=「しょっぱい」では,何ともおかしな話ですね。つまり,表1の符号化は,不適切だということになります。

表2●味覚コードの案(その2)
 表2[拡大表示]の符号化ではどうでしょう? こんどは,個々の味覚ごとに1とするけたを変えています。これなら,どのように味覚コードを加算しても減算しても,上手く行きます。このように,符号化には,ちょっとした工夫が必要なのです。

●文字コード

 コンピュータの世界では,統一的な文字コードが定められています。ただし残念なことに,文字コードのルール(コード体系)は,1種類だけではありません。文字コードの元祖は,ANSI(米国規格協会)が制定し,英数記号を1文字7ビットで表すASCII(American Standard Code for Information Interchange,アスキー)コードです。コンピュータが取り扱うデータの基本単位は1バイト=8ビットですが,7ビットあれば128通りの文字を表せるので,英数記号には十分なのです。通信でデータを送る場合を考えて,1ビットでもデータを短くし,少しでも通信時間を短縮したいという工夫です。

表3●ASCIIコードのコード体系
 表3[拡大表示]は,ASCIIコードのコード体系です。7ビットの上位3けたと下位4けたから文字コードを得られるようになっています。例えば,大文字のAは,ASCIIコードで41となります。ここでは,16進数と呼ばれる数値の表し方が使われています。

 16進数は,2進数を少ないけた数で表したい場合に便利です。2進数の4けたで表せる00001111が,16進数の1けた(0~F)にピッタリ当てはまるからです。16進数は,16まで数えるとけた上がりする数の数え方です。0,1,2,3,…,8,9,A,B,C,D,E,Fまで数えたら,10にけた上がりします。アルファベットのA~Fを,数値を表すために使っていることに注意してください。41という16進数は,1000001という2進数と同じです。

 わずか128通りのASCIIコードでは,漢字を表すことはできません。そこで,日本国内でJIS(日本工業規格)コードが考案されました。JISコードは,漢字1文字を2バイトの数値で表します。2バイト=16ビットあれば,2の16乗すなわち65536種類の文字を表せます。さらに米国マイクロソフト社は,JISコードを改良したシフトJISコードを考案しました。Unix(Linux,FreeBSD,Solarisなど)の世界では,EUCと呼ばれるコード体系が使われています。すなわち,現在では,複数の文字コードが存在しているわけです。

 インターネットが普及し,世界中のコンピュータが相互にデータを授受できるようにするためには,文字コードの統一が必要となります。そこで,考案されたのがUnicode(ユニコード)と呼ばれるコード体系です。Uniとは,「Uniform=統一」という意味です。UnicodeはISO(国際標準化機構)規格となり,国際的に認められていますが,実際に文字コードが統一されるには,まだまだ時間がかかりそうです。皆さんがお使いのWindowsマシンは,シフトJISコードとUnicodeの両方が使えるようになっています。Unicode統一への過渡期なのです。

●小数点数を表す方法

 そのまま計算できる数値データの表し方には,統一された表現方法があります。整数は,2進数(補数表現も含む)で表します。小数点数は,0と1だけの2進数ではドット(.)を表す手段がないので,IEEE(米国電気電子技術者協会)で制定された“単精度浮動小数点数形式”および“倍精度浮動小数点数形式”と呼ばれる表現方法が使われます。これらは,小数点数を「符号○○×2の△△乗」という指数形式で表すものです。○○の部分を仮数部と呼び,△△の部分を指数部と呼びます。もちろん,仮数部も指数部も2進数で表現します。符号は,1ビットで表され,0ならプラス,1ならマイナスです。

図1●浮動小数点数形式の表現方法
 単精度浮動小数点数形式と倍精度浮動小数点数形式の違いは,1つの小数点数を表すために使われるビット数です。単精度浮動小数点数形式は32ビットを使い,倍精度浮動小数点数形式は64ビットを使います(図1[拡大表示])。

 整数と浮動小数点数を使えば,コンピュータは,あらゆる数値データを表せるのでしょうか。残念ながら答えはNOです。例えば,10進数の0.1を浮動小数点数形式で表すと循環小数(小数点以下が永遠に続く数)となってしまいます。これは,10進数で1/3=0.3333…となってしまうことと同じです。永遠に続く数を限られたビット数のデータとして表すことなどできません。結果として,コンピュータで小数点数の演算を行うと,場合によっては正しい答えが得られない(小数点数の下位けたが切り捨てられる)ことがあります。

 この問題を解決するためには,データを10倍して演算すればよいのです。0.1が循環小数になってしまうなら,それを10倍した1として演算を行い,演算結果を画面に表示するときにだけ,小数点を付ければよいのです。符号化には工夫が必要だということを,お分かりいただけましたでしょうか。