いよいよデータの具体的な話を始めます。前回述べたようにデータにはさまざまな型がありますが、その中でも文字(char)型を重点的に説明していこうと思います。
2進数、10進数、16進数
文字の話を始める前に、まず2進数、10進数、16進数の話をします。基本的なことですので、知っている方も多いと思いますが、知らない方はしっかりと覚えてください。それ程、難しいことではありません。
コンピューターは2進数の世界です。つまり、0と1で成り立っています。電流が通ったかどうか、フラグが立っているかどうか、Yes/No、On/Offといった2つの状態しか存在しません。「0か1」の状態を表す最小の単位を「ビット(bit)」と呼びます。
一方、私たちは一般的に10進数を使用しています。次の2進数、10進数、16進数の表を見てください。
10進数 2進数 16進数
0 0000 0
1 0001 1
2 0010 2
3 0011 3
4 0100 4
5 0101 5
6 0110 6
7 0111 7
8 1000 8
9 1001 9
10 1010 A
11 1011 B
12 1100 C
13 1101 D
14 1110 E
15 1111 F
16は「0001 0000」になります。
1桁で表される10進数の「0~9」は、2進数では4桁も必要になります。さらに10進数の「1000」は、2進数では「11 1110 1000」と10桁になってしまいます。このように、2進数では数が大きくなれば桁数は膨大なものになります。2進数はコンピュータには都合の良い書き方ですが、人間には10進数のように簡単に扱える書き方ではありません。そこで、どちらにも都合の良い方法である16進数が採用されるようになりました。
10進数では「0~15」の数を16進数では「0~F」で表します。この「0~F」で表すことができる数が2進数ではちょうど4ビットの数となるので、コンピュータには2進数に変換しやすく、人には表記しやすい方法になります。2進数は4ビットずつ表記されることが多いのは、コンピュータと人間の両方に都合が良いためです。16進数でA、B、C…というアルファベットを使っているのは、単に0~9の10個では足りないからというだけです。
10進数の「16」は、2進数で「0001 0000」、16進数で「10」になります。16進数で「10」と表していますが、これは10進数の10「じゅう」ではないので、「"じゅう"とは読まず"いちぜろ"と読む」という人もいます。
最小の単位は「ビット」ですが、実際にPC上では8ビットを1つの固まりにしてデータを表します。これを「バイト(byte)」と呼びます。1バイトで表せる数は次のようになります。
10進数 2進数 16進数
16 0001 0000 10
17 0001 0001 11
18 0001 0010 12
19 0001 0011 13
… … …
255 1111 1111 FF
バイト単位で表すのは、16進数が2桁で表記できる最大の数だからです。なお、2進数は頭の0をとって表すのも一般的で「0011」は「11」、「0001 0001」は「1 0001」のようになります。
本格的にプログラミングを学びたい方はこの関係をしっかり学ぶ必要がありますが、今のところこの程度で十分です。2進数や16進数、ビットやバイトの話は、別の講義で説明したいと思います。
あまり深入りせずに、さらっと説明しましたが、2進数、10進数、16進数の関係が何となくわかっていただけたでしょうか。
これから説明していくプログラム言語では、多くの場合(計算など)10進数が使われますが、文字は16進数で表されます。
半角文字
ここから、やっと文字の話になります。
聞いたことはあると思いますが、文字には半角文字と全角文字があります。まずは半角文字から説明します。
半角文字は、英語では「single byte」または「half width」となります。
では、この「半角」ってどういう意味でしょう。
これは、まだフォントが固定幅だった頃(MS-DOSやワープロ専用機)に、半角文字が全角文字の半分の幅で表示されていたため、プロポーショナルフォントが使われるようになった今でも慣習的に呼ばれています。元々は印刷用語で、コンピューターの世界では正しい用語ではありません。場合によっては、2バイトの半角文字もありますので、これからは1バイト文字と呼ぶようにします。
すでに述べましたが、文字は16進数で表されます。つまり、1バイト文字はその名のとおり、1バイト(00~FF)で表され、このバイトは文字コードと呼ばれます。文字と文字コードの関連付けをコード体系と呼びますが、1バイト文字のコード体系は次の2つが代表的です。(文字コードやコード体系などの用語は定義が難しいため、別の機会に説明します。)
- EBCDIC(Extended Binary Coded Decimal Interchange Code)
IBM社が規定したコード体系で、主にメインフレーム(汎用コンピューター)で使用されます。
- ASCII(American Standard Code for Information Interchange)
「アスキー」と呼ばれるコード体系で7ビット(00~7F、10進数では0~127)で表現されます。1バイトの文字はASCIIが世界標準ですので、こちらをしっかり理解してください。
ASCIIコード
ASCIIはANSI(American National Standards Institute:米国規格協会)が定めた7桁の2進数で表現できる文字コードです。制御文字、整数、アルファベット、記号で構成されています。欧米の初期のコンピューターではこれらの文字で十分であったため、最小単位1バイトに収まるように定義されています。
00~1F、7Fが制御文字、20~7Eが記号、英数字に割り当てられています。
英訳の時、「全角文字を残さない」という指示がある場合、使用できる文字は、この「20~7E」の範囲にある文字だけです。
表の見方ですが、縦軸と横軸の数字を足した数字が文字コードになります。
例)
「A」は縦軸:0040、横軸:1で、文字コードは0041(または41)
「m」は縦軸:0060、横軸Dで、文字コードは006D(または6D)
また、「0041(41)」、「006D(6D)」は16進数であることを示すためにそれぞれ「0x41」、「0x6D」と表されます。
この「0x」は16進数であることを示すための接頭辞です。秀丸エディターの「文字コード表示」やIMEパッドでは、文字コードに「0x」が付きますが、ATOKの文字パレットや他のエディターでは「0x」なしで表示されます。
ASCIIで割り当てられる文字コード0x00~FF(0~127)は他のコード(シフトJISやUnicode)でも同じです。
このように、1バイト文字で表現できる文字は記号と英数字のみですが、これ以外の文字を使用する日本や他の国では、ASCIIコード以外の体系が必要になります。そこで、日本の場合、1バイトの領域のうち、ASCIIで使用されていない領域(0x80~FF:128~255)を使って、日本独自の1バイト文字を表現することにしました。これが半角カタカナと呼ばれるものです。文字コードは0xA1~0xDFを使用します(IMEパッドや文字パレットで確認してみてください)。文字化けなどの問題があると嫌厭された時期がありますが、消費メモリーが少ないこと、表示領域が少なくて済むことから、現在でも使用されています。通常の翻訳ではめったに使用されません。
以上で、1バイト文字について説明を終わります。
今回は、
- 「ビット」と「バイト」という単位がある
- 2進数、10進数、16進数が使用される
- 文字は16進数で表現される
- 半角文字は1バイト文字
- ASCIIコードが標準である
ということを理解しておいてください。
次は2バイト(多バイト)文字について説明します。
では、また。
修正・追記:オレンジのハイライト部
コード化が理解できてうれしいです。自分のブログにも、引用させてもらいました。
ありがとうございます。