メモリの中を覗く:バイトとエンディアン
ここまでに学んだ2進数や16進数のデータは、コンピュータの一時記憶装置「メインメモリ(RAM)」にどう収められているのでしょうか。メモリのアドレスの仕組みと、複数バイトの並び順を巡る「エンディアン論争」の本質に迫ります。
1. メモリは「住所付きのロッカー」
コンピュータのメインメモリ(RAM)は、論理的には「1バイトのデータが入るロッカーが一列に果てしなく並んだもの」と考えられます。
それぞれのロッカーには、データを区別・指定するための「住所(アドレス/番地)」が 0 番地から順に割り当てられています。
CPUは、この「番地」を指定することで、特定のロッカーにデータを書き込んだり、中身を読み出したりします。
2. 「ワード(Word)」という単位
メモリの最小アクセス単位は1バイトですが、現代のCPUはもっと大きな単位で一度にデータを処理します。このCPUが一度に扱うデータ単位を「ワード(Word)」と呼びます。
よく「64ビットPC」と言われるのは、1ワードが64ビット(=8バイト)であることを意味します。64ビットCPUは、メモリから一度に8バイト分のデータを束ねて高速に読み書きできます。
3. 複数バイトの並び順「エンディアン(Endian)」
ここで1つの問題が発生します。
例えば、1ワードが4バイト(32ビット)のコンピュータにおいて、16進数の 0x12345678 という数値をメモリに保存したいとします。
この数値は、1バイト(2桁)ずつに分解すると、12, 34, 56, 78 の4つに分かれます。
これをメモリのアドレス 0x0000 番地から順に配置するとき、次の2通りの並べ方が考えられます。
- ビッグエンディアン(Big Endian): 桁の大きい(上位)バイトから順に並べる方式。
- リトルエンディアン(Little Endian): 桁の小さい(下位)バイトから順に並べる方式。
ビッグエンディアンは、人間が数値を書く順序(左から右)と同じなので、メモリダンプを直感的に読めます。主にネットワークプロトコル(TCP/IPなど)のデータ送信順として採用されています。
一方、リトルエンディアンはメモリ上では逆順に並んで見えます。しかしCPUにとっては、計算を下位の桁から順に行うため、若い番地(0x00)から読み進めるだけで下の桁からデータを取り出せるという利点があります。
現代の多くのPC――Intel x86/x64やApple SiliconなどのARMプロセッサ――では、リトルエンディアンが主流です。
ガリバー旅行記に由来する名前:
「エンディアン」という奇妙な名前は、風刺小説『ガリバー旅行記』に由来します。「ゆで卵を丸い端(Big-end)から割るべきか、尖った端(Little-end)から割るべきか」で国を二分する論争が描かれており、コンピュータ業界でも同様の論争が起きたことから、このユーモアある名前が定着しました。