コンピュータのデータ表現

コンピュータと情報処理

この章では、コンピューターが内部でどのようにデータを扱っているのかを学習します。ここまで、大まかなコンピュータの仕組みについて学習してきました。しかし、コンピューターはどのように情報やそれに対応する判断を記憶させるのでしょうか?実は、コンピューターは0と1という二つの数字しか理解することができません。言い方を変えると、コンピューターは0と1という二つの数字だけを使ってすべての情報を処理しているといえます。

この0と1は電気信号としてコンピューターに認識させます。ひとつの例では、電気信号が通っている状態を0、電気信号が通っていない状態を1という具合です。つまり、コンピュータの仕組みを理解するには、この仕組みを理解しうる必要があるわけです。そこで、ここからは、数値・文字・論理値をコンピューターがどのように表現しているかを学習していきます。

コンピューターの数値表現

2進法

0と1の二つの数字のみを用いて数値を表現することを2進法といい、それによって表現される数値を2進数と言います。私たちが日常使っている数字は10進法と呼ばれ数値は10進数と言います。10進法では、数値が0,1,2,…,9のあと、位が繰り上がり、10になります。それに対し、2進法とは、0,1しか数値がないことから、10進数の2で数値が繰り上がります。

二進数と10進数の対応を表すと、以下のようになります。(表6-1.)

表6-1.2進数と10進数の対応表
10進数 2進数 10進数 2進数 10進数 2進数 10進数 2進数
0 0 4 100 8 1000 12 1100
1 1 5 101 9 1001 13 1101
2 10 6 110 10 1010 14 1110
3 11 7 111 11 1011 15 1111

10進法は10のグループができれば繰上げ、2進法は2のグループができれば繰り上げればよいことがわかります。2進数を表記する際には、10進数と区別するために、数値の右下に(2)と記述します。

2進数の例
1001(2)   0011(2)

コンピュータ内に置いて、スイッチが入った状態を、2進法の数値の「1」、オフになった状態のものを「0」とすれば、コンピュータの内部の数値を2進数で表現することができるのです。つまり、2進数の数値の一つが、1ビットに対応するわけです。

メモリー上のある領域1バイト(=8ビット)をイメージすると以下のよう表せます。

2進数と10進数の変換

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

まず、2進数を10進数に変換するにはどうすればいいかを考えてみます。すでに述べたとおり、10進数が10で位が繰り上がるように、2進数は2で位が繰り上がります。したがって、2進数の値は以下のように表わすことができます。

P1P2P3P4(2) = P1×23+P2×22+P3×2+P4

Pnには、0か1が入ります。では1101(10進数の13)を例にとってみます。1101は次のように表現できます。この例の場合は4桁ですが、さらに上位の桁の場合も同様です。

1101(2) = 1×23+1×22+0×2+1×1=13

となります。

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

今度は逆に10進数を2進数に変換してみます。まずは、10進数の123という数値を考えてみます。すでに説明したとおり、2進数にするためには、数値を、P1×23+P2×22+P3×2+P4のような形で表せばよいわけです。そのためには、商が0になるまで2で割っていき、余りを逆に読めばいいことになります。例として、7を2進数に変換してみましょう。

2 )  7      余り
2 )  3       1   
2 )  1       1   
      0        1   

これにより、10進数の7を2進数にすると、解111(2)となります。

16進法

16進法とは

ここまで2進数について学習してきました。コンピューターは2進法で計算しているわけですが、桁が多く、見にくいことから、通常は16進数で表記する場合がほとんどです。ここで16進数の学習をしておきます。

16進数(法)は、16で次の桁に上がる数です。ただ、私たちは0~9までの10個の数字しか知りませんので、残り6個を表現するために、アルファベットのA,B,C,D,E,Fを追加します。(小文字を使う場合もあります。)10進法の数値と16進法の数値の対応は、以下のようになります。(表6-2.)

表6-2.10進数と16進数の数の対応
16進数0123456789ABCDEF
10進数0123456789101112131415

AやBなどの文字が出現すれば16進数であることがわかりますが、11や80などでは10進なのか16進なのか判断がつきません。そこで、16進数であるということを明記するために数値の前に「0x(ゼロエックス)」と添えて表記したり、16進数の後の右下に(16)と記したりします。

なので、16進数の数は、0xffff0x10ffff(16)10(16)などと表記したりします。

16進数の例
0x10f   0012(16)

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

次に16進数から10進数への変換を考えてみましょう。n桁目の数値は、16進数の各桁の数値に、16の(n-1)乗をかけます。右から、第1桁は16の0乗、第2桁は16の1乗、第3桁は16の2乗…といった具合です。

P1P2P3P4(16) = P1×163+P2×162+P316+P4

Pnには、0から15が入ります。具体的に7C(16)を10進数に変換してみましょう。

7C(16) = 7×161+12×160=124

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

次に10進数を16進数に変換するには、2進数の場合と同様、16で割っていきその余りを逆に並べればよいのです。具体的に10進数の621を例にとり実際に演算をしてみます。

16 )  621      余り
16 )  38       13   
16 )  2            6   
16     0            2   

13は、16進数でD、となるので、621を16進数で表記すると、26D(16)となります。

コンピューターの文字

ASCIIコード

コンピューターが文字や数値、記号を扱うために、文字や記号のひとつひとつには固有の数字が割り当てられています。これを文字コードといいます。また、どの文字にどの数字を割り当てるかという規則が作られていて、これを文字コードセットといいます。

その中で、最も基本的なコードが、ASCIIコード(アスキーコード)という文字コードセットです。ASCIIコードは英語圏での世界標準とされている文字コードセットで、他の文字コードセットもASCIIコードを参考にして作られています。

ASCIIコードでは、4ビット+4ビットで合計1バイト(=8ビット)の領域を使って文字を表現しています。そのため、未使用の領域を含めて256種類の文字や記号を表現することができます。

たとえば、アルファベットの大文字Aを例にすると、上位4ビットでは2進数で「0100」の行、下位4ビットでは「0001」の列にあります。すなわち、「A」という文字をASCIIコードで表すと、2進数の「0100 0001」、つまり16進数では「41」ということになります。

多言語対応の文字コード

コンピューターの進化と普及にともなって、他の国、たとえば日本などの文字にも対応することが必要となりました。しかし、ASCIIコードは128文字しか文字を表現できないため、さまざまな新しい文字コードが作成されました。以下に、現在用いられている主な文字コードを紹介します。(表6-3.)

表6-3.主な文字コード
文字コード 説明
Shift_JIS 「シフトジス」と読み、マイクロソフト社が中心となって制定された文字コードセットです。
1文字に2バイトの領域を使用することで、日本語への対応が図られました。
EUC-JP 「イーユーシージェーピー」と読みます。UNIX/LINUX系のOSで日本語を使用するために作られた文字コードセットです。
UTF-8 「ユーティーエフエイト」と読みます。各国ごとにそれぞれ制定された文字コードセットを統合しようと作られたものです。
Web系では標準的に用いられるようになっています。

論理演算

論理演算とは

5日目では、コンピュータ内でのデータ表現について説明しました。ここでは、そのデータを扱う演算について説明します。

コンピュータが何らかの計算を行うことを、演算(えんざん)と言います。足し算や掛け算のような、私たちが知っているような計算のことを、算術演算(さんじゅつえんざん)と言います。コンピュータは、算術演算を行うこともできますが、同時にコンピュータ独自の演算処理もあります。それが、論理演算(ろんりえんざん)と呼ばれるものです。

真偽値と論理演算の種類

次の2つの命題があるとします。命題とは質問のことです。

①今日は晴れである。
②日本は国である

これらの命題は、いずれもYes(真)かNo(偽)かで答えることができる単純な命題です。この命題を条件として、さらにYes(真)No(偽)かの命題(演算)を問いかけることを論理演算といいます。また、このような命題に対するYes(真)かNo(偽)かの答えのことを真偽値(論理値)と呼びます。

コンピューターはこの真偽値を0と1の二つの数字のみを使って表現します。例えば、0を真、1を偽を表す数字とします。コンピュータのデータ処理の単位は2進数であることから、コンピュータと論理値が相性が良いことが分かります。

このような論理値を用いた演算には様々な演算がありますが、特に重要で基本的なものに、論理積(ろんりせき)論理和(ろんりわ)論理否定(ろんりひてい)排他的論理和(はいたてきろんりわ)があります。以下、それらの演算について説明していきます。

論理演算の種類

論理積

別名AND(アンド)演算と言います。二つの命題の真偽値が両方とも真だった場合にのみ判断が真になる論理演算です。(表6-4./図6-1.)

図6-1.論理積
表6-4.論理積
命題① 命題② 判断

論理和

別名OR(オア)演算と言います。二つの命題の真偽値がどちらか真だった場合に真になる論理演算です。(表6-5./図6-2.)

図6-2.論理和
表6-5.論理和
命題① 命題② 判断

論理否定

別名NOT(ノット)演算と言います。一つの命題の答えのみを用いる論理演算です。命題の答えの逆が最終的な答えになります。(表6-6./図6-3.)

図6-3.論理否定
表6-6.論理否定
命題 判断



排他的論理和

別名XOR(エックスオア)演算と言います。二つの命題の片方のみが真だった場合に判断が真となる論理演算です。

二進数と10進数の対応を表すと、以下のようになります。(表6-7./図6-4.)

図6-4.排他的論理和
表6-7.排他的論理和
命題① 命題② 判断

例えばパーティーに行く場合を考えます。「A君が参加する」と「B君が参加する」という二つの命題をもとに「自分がパーティーに参加するかどうか」の判断をしたとき、どちらかが行くと参加するが、どちらも参加した場合は参加しないということになります。