(2)ハードウェア(CPUとメモリ)について
C言語を習得するには、ハードウェアに関する知識が少しばかり必要になります。
最低限としてCPUとメモリに付いては知らないとお話になりませんのでまずはその辺の解説をしたいと思います。
コンピュータは演算(計算)するためのCPUとデータを記憶しておくためのメインメモリ、
それと演算に使うデータ等の入出力(I/O)の3つで構成されています。
パソコン用のプログラミングをする場合、
I/Oに関してはとりあえず標準関数などを使用すると思いますので詳しく知らなくても何とかなると思いますので割愛します。
ということで、まずはCPUのお話です。
一般的なWindowsパソコンのCPU(Central Processing Unit)はx86系CPU(x64)です。
このCPUのデータバス※1幅は64ビットで、
エンディアンはリトルエンディアンです。
- ※1
- データバスとはCPU内部に配線されているデータを送受信するための電線(バス)のことで、 バス幅が64ビットとは1ビットが電線(バス)1本に対応しますので「電線(バス)が64本あります」ということです。 データバスが64本ありますと、CPUは1度に0~(2^64-1)までの正数値を扱うことができます。 ちなみにCPUは拡張命令(FPU, SSE等)を使うことで浮動小数点数というものを扱うこともできます。 浮動小数点数とは私たちが一般的に使用する小数点を含む数値から天文学的な数値まで扱うことができるものです。
CPUにはレジスタという演算等に使用する高速で特殊なメモリがあります(キャッシュメモリとは違いますよ!)。 最近のコンパイラは賢いのでレジスタを意識してプログラミングする必要は「ほぼ」ないと思います。 もしあなたが「アセンブラをやりたーい」とか「ハードウェアを直接制御したーい」とか言い出さなければ知らなくても問題ないと思います。
エンディアンのご説明の前にメモリがどうなっているかを解説します。
メモリは8ビット(1バイト)を基本※2として構成され、1つ1つの8ビット(1バイト)の各メモリに0から順に番号(番地、アドレス)が割付けられています。 メモリにアクセスするにはこの番号(以降、アドレスと呼びます)を指定してアクセスすることになります。
1GBのメインメモリを搭載しているパソコンであれば、8ビット(1バイト)のメモリが1G(1Gは1024×1024×1024)分搭載されてることになります。
- ※2
- 一般的なコンピュータでは8ビットですが、変な(特殊な)コンピュータですと8ビットではない場合があります。
図1.メモリ構成
エンディアンとはメモリにデータを読み書きするときの順番のことで、リトルエンディアンとは小さな値をメモリアドレス値の小さな方に書き込むことです。 逆もあり、ビッグエンディアンと言いますが、大きな値をメモリアドレス値の小さな方に書き込むことです。
図2.リトルエンディアンとビッグエンディアン
134480385(08040201H)という数値をアドレス0番地のメモリを指定して格納した時の様子です。
違いがお分かり頂けるかと思います。