「このコンピュータはリトルエンディアンだから注意してね!」と言われた時、「なんのこっちゃい!」と突っ込みたくなる方も多いかと思います。
そもそも「エンディアン」って何?と思われる方もいらっしゃるかと思います。
今回は、そんなエンディアンについてまとめてみました。
エンディアンとは?
コンピュータの中で計算をする場所と言ったらCPU(演算装置)ですよね。
CPUの中にはレジスタと呼ばれる記憶領域があり、演算する際にこのレジスタにデータを一時的に格納して、演算を行います。そして、演算結果をメモリ(主記憶装置)に渡します。
このレジスタの長さは最近ですと、32ビットや64ビットとなりますが、32ビットのCPUだとレジスタは4バイト単位で扱います。つまり、データを4つの箱(1バイト×4)に区切って入れることになります。
そうなると、4バイトのレジスタをメモリに格納する訳ですが、メモリは1バイト単位でデータを格納するので、4バイト格納するにはメモリも4つのアドレスの箱に格納します。
この時、データをメモリにどのような並び順で格納するのかを「エンディアン」と呼びます。別名ですと、バイトオーダとかバイト順とも呼びますね。
下にCPUとメモリのデータのやり取りのイメージを記載しました。
この並び順にはパターンがありますので、次はそのお話です。
ビッグエンディアンとリトルエンディアンの違い
エンディアンにはいくつかの種類がありますが、代表的(有名?)なのが、「ビッグエンディアン」と「リトルエンディアン」です。
下の図を見て頂ければ分かるかと思いますが、違いは以下のようになります。
- ビッグエンディアン:データの上位バイトから下位バイトの順にメモリへ配置する方式
- リトルエンディアン:データの下位バイトから上位バイトの順にメモリへ配置する方式
その他に上の例だと「CD AB 34 12」あるいは「12 34 AB CD」のように並べる方式もあり、これをミドルエンディアンと呼びます。
どっちが使われるの?
では、コンピュータの世界において、どのエンディアンが使われるのでしょうか?
歴史的なことや深い理由もあるのですが、簡単にまとめると以下のような感じになるかと思います。
- ビッグエンディアン
- 人間が普段慣れている記法と同じ順序(左から右)なので、わかり易い
- ネットワーク機器(TCP/IP)においてはビッグエンディアンが使われる
- リトルエンディアン
- 数値計算等をする際にも有利に働く(詳しくはWikipedia参照)
- Intel系のCPUで利用されている
CPUの種類によって、ビッグエンディアンだったり、リトルエンディアンだったりするのですね。深い。。。
つまり、ネットワーク経由でデータを送るときにはエンディアン変換をしながら送ったりするのですね。
まとめ
今回はメモリ(主記憶装置)上にCPU上のデータをどのように格納するかを決めるエンディアンに関して解説しました。
- データをメモリにどのような並び順で格納するのかということ
- ビッグエンディアン:データの上位バイトから下位バイトの順にメモリへ配置する方式
- リトルエンディアン:データの下位バイトから上位バイトの順にメモリへ配置する方式
- それぞれでメリット、デメリットがある
ビッグエンディアンとリトルエンディアンを間違って覚えないよう、「ビッグは上から」、「リトルは下から」と覚える良いかもしれませんね。(そんなに凝った覚え方ではありませんが。。。)
ちなみにエンディアンの語源は「ガリヴァー旅行記」の中にゆで卵を丸い方(大きい方)の端 (big end) から割る人々(Big Endians)と尖った方(小さい方)の端 (little end) から割る人々 (Little Endians) との対立というエピソードがあって、そこからきているようです。面白いですね。
以上です!