矢沢 久雄
●何でも数値で表すコンピュータ
第1回,第2回の連載を読んで「コンピュータのハードウエアは,ディジタルICで構成されていて,情報を2進数で取り扱っている」ことを理解していただいた皆さんなら,「コンピュータがすべての情報を数値として取り扱っている」ということも納得していただけるでしょう。コンピュータが取り扱う情報とは,コンピュータを動作させる命令と,命令の対象となるデータのことです。数値で表された命令は,「マシン語」または「ネイティブ・コード」と呼ばれます。これに関しては,連載の第4回で説明します。今回のテーマは,数値で表されたデータです。
コンピュータで123+456の演算結果を求めるなら,123と456という数値と,その結果である579という数値を取り扱うだけです。ところが,コンピュータを使う人間は,数値以外のデータである文字,色,味覚などもコンピュータで取り扱いたいと考えることもあります。そのためには,文字,色,音など,本来なら数値でないデータを数値で表す「符号化(コード化)」という工夫が必要になります。符号(コード)とは,数値化されたデータのことです。
符号化は,コンピュータを使う皆さんが自由に行っていい場合と,あらかじめ決められた符号化のルールに従わなければならない場合があります。例えば,味覚を表すデータなら,皆さんが自由に符号化してかまいません。コンピュータに接続される周辺機器に,味覚を取り扱うものはないからです(もしも,そのような周辺機器が存在したとしても,一般的ではないでしょう)。それに対して,文字や色を表すデータは,あらかじめ定められた符号に従わなければなりません。キーボードやプリンタなどの周辺装置は,特定のルールで符号化された文字(文字コード)を取り扱います。ディスプレイやカラー・プリンタなどの周辺装置は,特定のルールで符号化された色(色コード)を取り扱います。皆さんが自分勝手に定めた符号では,これらの周辺装置が正しく動作しないのです。
![]() |
表1●味覚コードの案(その1) |
ここでは,「あまい」~「にがい」を連続した2進数の値で符号化しています。「あまい」と「からい」を組み合せて「あまからい」という味覚を表したいとします。何でも数値で表すコンピュータなのですから,数値の加算で実現したいですね。「あまい」+「からい」=00000001+00000010=00000011となります。加算結果の00000011は,「しょっぱい」を表す味覚コードです。「あまい」+「からい」=「しょっぱい」では,何ともおかしな話ですね。つまり,表1の符号化は,不適切だということになります。
![]() |
表2●味覚コードの案(その2) |
●文字コード
コンピュータの世界では,統一的な文字コードが定められています。ただし残念なことに,文字コードのルール(コード体系)は,1種類だけではありません。文字コードの元祖は,ANSI(米国規格協会)が制定し,英数記号を1文字7ビットで表すASCII(American Standard Code for Information Interchange,アスキー)コードです。コンピュータが取り扱うデータの基本単位は1バイト=8ビットですが,7ビットあれば128通りの文字を表せるので,英数記号には十分なのです。通信でデータを送る場合を考えて,1ビットでもデータを短くし,少しでも通信時間を短縮したいという工夫です。
![]() |
表3●ASCIIコードのコード体系 |
16進数は,2進数を少ないけた数で表したい場合に便利です。2進数の4けたで表せる0000~1111が,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●浮動小数点数形式の表現方法 |
整数と浮動小数点数を使えば,コンピュータは,あらゆる数値データを表せるのでしょうか。残念ながら答えはNOです。例えば,10進数の0.1を浮動小数点数形式で表すと循環小数(小数点以下が永遠に続く数)となってしまいます。これは,10進数で1/3=0.3333…となってしまうことと同じです。永遠に続く数を限られたビット数のデータとして表すことなどできません。結果として,コンピュータで小数点数の演算を行うと,場合によっては正しい答えが得られない(小数点数の下位けたが切り捨てられる)ことがあります。
この問題を解決するためには,データを10倍して演算すればよいのです。0.1が循環小数になってしまうなら,それを10倍した1として演算を行い,演算結果を画面に表示するときにだけ,小数点を付ければよいのです。符号化には工夫が必要だということを,お分かりいただけましたでしょうか。