コンピュータは何でもビット列(二進数の数値。小さなオン/オフのスイッチがたく さんあると考えてもかまいません)として持っていることは多分ご存知でしょう。 この節では、コンピュータがガリガリ処理している文字や数値はこういった ビット列をどのように使って表すのかを説明します。
説明を始める前に、コンピュータのワードサイズについて理 解しておく必要があります。ワードサイズは、ある情報のかたまりをコンピュータ が動かすときに好む大きさのことです。技術的には、これはプロセッサの レジスタの幅です。レジスタとは、コンピュータが数値演算 や論理演算を行う際にデータを保持するために使う領域です。 一般にコンピュータをビットサイズを使って言い表す(例えば「32 ビット」や「64 ビット」のコンピュータと呼ぶ)場合は、このことを言っているのです。
ほとんどのコンピュータ(386, 486, Pentium, Pentium II の PC)のワードサイズは 32 ビットです。古い 286 マシンのワードサイズは 16 ビットです。古い形式の メインフレーム機の多くのワードサイズは 36 ビットでした。いくつかのプロセッサ (例えば昔の DEC, 今の Compaq から出ている Alpha 等)のワードサイズは 64 ビット です。64 ビットのワードサイズは、これからの 5 年間でもっと一般的になるでしょ う。Intel は、Pentium II の後継として `Merced' と呼ばれる 64 ビットチップを 計画しています。
コンピュータは、0 から始まりメモリサイズで決まる大きな値までが振られたワード の並びとしてコアメモリを扱います。この値はコンピュータのワードサイズによっ て決まります。そのため、286 のような古いマシンで大量のメモリを使うには、苦 労してひねくれたことをしなければなりません。ここではその説明はしません。 昔からのプログラマにはまだ悪夢でしょうしね。
数値はワードを使って表すか、ワードの組を使って表します。どうなるかは プロセッサのワードサイズで決まります。ワードサイズは 32 ビットがもっとも一 般的です。
整数値は数学的な意味での二進数によく似ていますが、実際には異なるものです。 低位のビットは順に 1, 2, 4, …となり、完全に二進数です。しかし、符号付きの 数を表すには2 の補数を使います。高位のビットは 符号ビットであり、値を負にします。負の数は常に、 対応する正の数の全てのビットを反転させることによって得られます。これにより、 32 ビットのマシンは -2^31 から 2^31 - 1 までの数を表せます(^ は「べき乗」の 演算です。つまり 2^3 = 8 となります)。32 番目のビットは符号を表すために使い ます。
一部のコンピュータ言語では、符号無し数値を使えます。こ れは 2 を基数とし、0 と正の数しか扱いません。
ほとんどのプロセッサと一部の言語は、浮動小数点の数値を 扱えます(この機能は、最近の全てのプロセッサチップに載っています)。 浮動小数点を使うと、整数よりもずっと広い範囲を扱えますし、小数も表現できま す。浮動小数点を実現する方法はいろいろあり、ここで説明するにはちょっと難し すぎるのですが、一般的な考え方はいわゆる「科学計算記法」に似ています。 この記法では(例えば) 1.234 * 10^23 といった書き方をします。この記法の数値 は、仮数 (1.234) と 10 のべき乗を掛けるための指数(23)に 分けられます。
文字は普通、ASCII(American Standard Code for Information Interchange) と呼 ばれるエンコーディングの 7 ビット単位のデータで表されます。最近のマシンでは、 128 個の ASCII 文字のそれぞれは、8 ビットのオクテット の下位 7 ビットです。オクテットは、(例えば)6 文字の文字列が 2 つのメモリワード となるようにメモリワードに詰め込まれます。ASCII のコード表を見るには、 Unix のプロンプトで `man 7 ascii' と入力してください。
前の段落には紛らわしい点が 2 つあります。ちょっとした方は、「オクテット」と いう言葉は公式には正しいのですが、実際に使われることがほとんどない点です。 大部分の人はオクテットをバイトの意味で使い、バイトとは 8 ビット長だと思っています。厳密に言うと、「バイト」という言葉の意味はもっ と一般的です。例えば、昔はバイト長が 9 ビットの 36 ビットマシンがありました (こんなものはもう二度と出ないでしょうが)。
重要な方は、世界中で ASCII を使っているわけではない点です。実際には、世界の 多くの場所では ASCII は使いものになりません。ASCII はアメリカ英語で使う分に はいいのですが、他の言語のユーザが必要とするアクセント記号や特殊記号が足り ないのです。イギリス英語の場合でさえ、通貨のポンド記号がないという問題があ ります。
この問題を解決しようという試みがいくつかあります。これらは全て、ASCII が使っ ていない高位ビットを追加して使い、ASCII 文字集合を 256 文字の集合の下位の半 分とします。これらのうち、もっとも広く使われているのはいわゆる `Latin-1' 文字集合です(もっと公式には ISO 8859-1 と呼ばれます)。これは Linux, HTML, X のデフォルトの文字集合です。Microsoft は Latin-1 の亜流の バージョンを使っています。これは、 正しい Latin-1 では歴史的な理由から文字を割り当てずに残している領域に 右・左の二重引用符といった文字群を追加しています(これが原因で起こったトラブ ルに関するひどい話については demoroniser のページを見てください)。
Latin-1 はヨーロッパの主要な言語を扱えます。これには英語、フランス語、 ドイツ語、スペイン語、イタリア語、オランダ語、ノルウェー語、スウェーデン語、 デンマーク語が含まれます。しかしこれでもまだ十分ではありません。その結果、 ギリシャ語、アラビア語、ヘブライ語、セルビア-クロアチア語といった言語を扱う ために全部で Latin-2 から Latin-9 までの文字集合ができています。詳しくは ISO alphabet soup のページをご覧ください。
究極の解決法は、Unicode と呼ばれる巨大な標準規格(および、これと同等の双子で ある ISO/IEC 10646-1:1993)です。Unicode は、最も下位の 256 スロットについて は Latin-1 と全く同じです。この上位の 16 ビットの空間には ギリシャ文字、キリル文字、アルメニア文字、ヘブライ文字、アラビア文字、 デバナーガリー文字、ベンガル文字、グルムキー文字、グジャラート文字、 オリヤー文字、タミル文字、テルグ文字、カンナダ文字、マラーヤラム文字、 タイ文字、ラオス文字、グルジア文字、チベット文字、日本語の仮名文字、 現代韓国のハングル文字の完全な集合、 そして中国/日本/韓国(CJK)の漢字を統合した文字集合があります。 詳しくは Unicode のホームページ をご覧ください。