ホーム第1章: 情報を数える・伝える
第1章 4節

メモリの中を覗く:バイトとエンディアン

ここまでに学んだ2進数や16進数のデータは、コンピュータの一時記憶装置「メインメモリ(RAM)」にどう収められているのでしょうか。メモリのアドレスの仕組みと、複数バイトの並び順を巡る「エンディアン論争」の本質に迫ります。

1. メモリは「住所付きのロッカー」

コンピュータのメインメモリ(RAM)は、論理的には「1バイトのデータが入るロッカーが一列に果てしなく並んだもの」と考えられます。

それぞれのロッカーには、データを区別・指定するための「住所(アドレス/番地)」が 0 番地から順に割り当てられています。 CPUは、この「番地」を指定することで、特定のロッカーにデータを書き込んだり、中身を読み出したりします。

... 0x0000 0x0001 0x0002 0x0003 0x0004 1バイト 1バイト 1バイト 1バイト 1バイト 番地(アドレス)
図 1-5:アドレス(番地)が割り当てられたメモリロッカーの概念モデル

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通りの並べ方が考えられます。

2つの並べ方(宗派)
  • ビッグエンディアン(Big Endian): 桁の大きい(上位)バイトから順に並べる方式。
  • リトルエンディアン(Little Endian): 桁の小さい(下位)バイトから順に並べる方式。
ビッグエンディアン (上位から配置) 12 34 56 78 0x00 0x01 0x02 0x03 リトルエンディアン (下位から配置) 78 56 34 12 0x00 0x01 0x02 0x03 番地(アドレス)の順向
図 1-6:数値 0x12345678 がそれぞれのエンディアンで配置される様子

ビッグエンディアンは、人間が数値を書く順序(左から右)と同じなので、メモリダンプを直感的に読めます。主にネットワークプロトコル(TCP/IPなど)のデータ送信順として採用されています。

一方、リトルエンディアンはメモリ上では逆順に並んで見えます。しかしCPUにとっては、計算を下位の桁から順に行うため、若い番地(0x00)から読み進めるだけで下の桁からデータを取り出せるという利点があります。 現代の多くのPC――Intel x86/x64やApple SiliconなどのARMプロセッサ――では、リトルエンディアンが主流です。

ガリバー旅行記に由来する名前:
「エンディアン」という奇妙な名前は、風刺小説『ガリバー旅行記』に由来します。「ゆで卵を丸い端(Big-end)から割るべきか、尖った端(Little-end)から割るべきか」で国を二分する論争が描かれており、コンピュータ業界でも同様の論争が起きたことから、このユーモアある名前が定着しました。