★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆
コンピュータの基本
★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆
−2進法−
一般的に人が計算をする時には 8+3=11 のように計算を行う。これは10進法での計算であり、多くの人は何の疑問もなく計算をしているかと思います。しかしコンピュータはスイッチのオン/オフで計算を行っております。このオン/オフの表現としては 1(オン) 、0(オフ) の表現が最も適しており、これにより上記の 8+3=11 を表現すると “1000”+“0011”=“1011”となります。 これが2進法です。 2進法での1〜10を表現すると
10進法 2進法
0 0000
1 0001
2 0010
3 0011
4 0100
5 0101
6 0110
7 0111
8 1000
9 1001
10 1010
になります。 2進法の基本的な事項は覚えておくと便利かと思います。
他には8進法、16進法等があり、特にコンピュータでは16進法を使う事が良くあります。 これは上記の2進法の0000に全て1が入った 1111 が10進法で15になり、0000を含めると16種類の数字を表す事ができる為です。8進法は処理単位が4ケタでなく3ケタの 000〜111の8種類の表現をする場合です。
なお上記の “0 あるいは 1” の1単位をビットと表現しております。 16進表現は4ビットが必要になります。
−32ビットと64ビット−
コンピュータの初期のマシンは処理単位が8ビットとか16ビットの時代がありました。UNIXが最初に開発されたPDPは18ビットマシンでした。 IntelのCPUもx86系は80286までは16ビットであり、1985年に出荷された80386から32ビットになりました。そして2000年のPentium4から64ビットになっております。ビット数による大きな違いはメモリー空間の表現です。32ビットマシンでは表現できるメモリー空間は4GBですが64ビットになる事によりメモリー空間は事実上、無限になり、物理的に搭載できるメモリーを全て使う事ができるようになります。
計算スピードについては、同じCPUを使うのであれば32ビットでも64ビットでも基本的には変わりません。 ただ32ビットマシンで倍精度演算(後で説明)をする場合はハードウエアで64ビット表現をできていないので計算は32ビットでの単精度に比べて64ビットの倍精度計算は圧倒的に遅くなります。これが64ビットマシンであえば32ビットの単精度でも64ビットの倍精度計算でも、ハードウェアで両者ともに計算できるので、それほど計算時間は変わりません。
−バイトとワード−
コンピュータではデータの長さを表現するのにバイトとかワードという言葉を使います。 特にバイトという言葉は良く使われるので理解しておく必要があります。 1バイトは8ビットです。 メモリー量を表現する時はバイト表現を使い、良くメモリーは4GB等と表現しますが、4GB(ギガバイト)とはビット数では8倍の 32×
ビットになります。
ワードとはメモリーのアクセス単位がバイトでなくワード単位のコンピュータで、多くのワードマシンでは1ワードは大体36ビットで構成されていました。しかし最近のマシンではワードマシンという言葉は聞かなくなっております。
ここで単位について触れておきます。 皆さんは良くご存知かと思いますが、メモリーやディスクの利用量、通信の速度、コンピュータの処理能力を表すのにK、M、G、T、P という単位が出てきます。 もしご存じなければ、これは覚えておいた方が良いかと思います。
K キロ 1,000
M メガ 1,000,000
G ギガ 1,000,000,000
T テラ 1,000,000,000,000
P ぺタ 1,000,000,000,000,000
です。ディスクの世界では テラバイト(TB)も良く聞きますので馴染んだ言葉ですね。 これからはPの単位が頻繁に出てくるようになるかと思います。
−浮動小数点と整数−
コンピュータで計算する上では実数計算と整数演算があります。 この実数演算で使われる数値表現が浮動小数点になります。この浮動小数点は数値を表現する際に10進数 123.456789 を表現する場合 0.123456789×
のように0.xxxx×
のように正規化して0.1〜1.0までの仮数部と
のXを表現した指数部に分けて表現する事ができます。
例えば64ビットマシンで浮動小数点を表現すると
符号部:1ビット 仮数部:52ビット
指数部:11ビット
等で表現可能です。 この各部分の長さはCPUによって異なります。上記表現はIEEE形式になります。
整数は1ビットの符号表現と整数値の表現になります。
−単精度と倍精度−
実数表現において4バイト/32ビットで実数を表現する方法を単精度と言います。 単精度の2倍のビット数(64ビット)を用いて実数を表現したものを倍精度と言います。昔は実数演算を単精度で行っておりましたが、精度を要求する上では倍精度での計算が必須になってきております。現在では多くの計算が倍精度計算されております。
それでは単精度、倍精度ではどのくらい精度が違ってくるかご説明いたします。 単精度では先に説明したように仮数部の長さが単精度で23ビット、倍精度で52ビットになります。 この仮数部で表現できる有効桁数は10進数表現で単精度の場合7ケタ、倍精度の場合で16ケタの有効桁数の表現が可能です。 32ビットの単精度で7ケタ以上のデータを正しく表現しようとしても
桁落ち
が発生します。また指数部の表現は単精度で8ビットと倍精度で11ビットになります。この表現だと単精度で10進で128〜-127、倍精度で1024〜-1023になります。 この表現を超えたような場合は
オーバーフロー/アンダーフロー
が発生し、実数データを正確に表現できなくなります。
−文字コード表現−
上記では実数値と整数値の表現について説明しましたが、コンピュータでは数字以外に文字も扱います。最初に表現された文字としてはASCII文字(American Standard Code for Information Interchange)で7ケタの2進数で表現できます。例えば大文字のA は 1000 0001 、 小文字のaは 110 001 で表現されます。このASCII文字には 0〜9の数字とA〜Z、a〜zの文字、そして !“#$%&‘()¥ や 改行 のような制御コードを含んでおります。
漢字文字は1バイト(8ビット)では表現できない為に2バイトを使います。 この為に漢字表現の設定をしていない環境では表示がおかしくなります。
−バイナリー表現−
良くデータのやり取りでバイナリーデータを渡すとかアスキーで渡すとか仕事上で話が出ることがあるかと思います。このバイナリーとは数値データを2進法である4バイトの単精度や、8バイトの倍精度の表現で現わしたデータをそのままやり取りする事です。この利点は計算結果をそのまま渡すので、精度を損なわず渡す事ができます。 一方、アスキーで渡すとは上記のASCII文字である「文字データ」としてデータを渡すことを意味します。 例えば整数値の 987654321 を文字データで渡す場合は、それぞれの1文字に1バイト(8ビット)を使いますので、ここでは9文字ありますので9×8ビットで72ビット(9バイト)使う事になります。これがバイナリー表現だと
0011 1010 1101 1110 0110 1000 1011 0001
の32ビット(4バイト)で表現できます。メモリーやディスクの占める割合が半分以下で済みます。また実数表現の場合などは文字として8文字位で表わそうとすると単精度の場合は良いですが、倍精度だと正確性が損なわれることになります。
−コンピュータでの数値計算−
コンピュータでの数値計算は簡単に計算できるように補数表現により負の数値を補数へ変換して足し算を行います。この内容は解析をやられる方には、業務上では必要性はないので参考程度に見て頂ければと思います。例えば 18 + 11 = 29 と 18 – 11 = 7 を考えた場合、
18 10010 18 10010
11 01011 11 10101
―――――――――――――――――― ――――――――――――――――――
足し算 11101 引算 (1) 00111
10進で29 10進で7
ここで補数表示とは 1の補数は元の数字を反転したもの、2補数は1の補数に1を加えた表現になります。
よって01011(11)の2の補数表示は 10100+00001 で 10101 になります。
これで簡単に足し算、引き算ができます。 コンピュータの計算時間は足し算が最も簡単で次が引き算、その次が掛算になります。除算は掛算の5倍程度の計算量になりますので割り算がある場合は、なるべく掛算に変換してあげると計算が早くなります。これはプログラムを作る人向けの情報ですね。