エンディアン(Endianness)とは
エンディアン、またはバイトオーダとは、
コンピュータが複数バイト(多バイト)で構成される数値をメモリに格納する際の、各バイトの順序に関する規則です。メモリは
通信路と見なせるため、
通信で多バイトデータを扱う際の送信順序もエンディアンの規則に従います。
エンディアンの必要性
コンピュータで扱う数値は、1バイトだけでなく、2バイト、4バイト、8バイトなど、複数のバイト(多バイト)で表現されることがあります。メモリを効率的に利用するために、最小単位である1バイトごとにアドレスが割り振られています。そのため、多バイト数値をメモリに配置する順序の規則が必要になります。この規則がバイトオーダ、またはバイト順と呼ばれるものです。
ビッグエンディアンとリトルエンディアン
エンディアンには主に2つの方式があります。
ビッグエンディアン (Big-Endian): 数値の最上位バイト(最も大きな桁)から順に、メモリのアドレスの小さい方から配置する方法です。
リトルエンディアン (Little-Endian): 数値の最下位バイト(最も小さな桁)から順に、メモリのアドレスの小さい方から配置する方法です。
エンディアン | バイトの配置順序 | 主な採用例 |
---|
:--- | :--------- | :-------------------- |
ビッグエンディアン | 最上位バイトから、アドレスの小さい順に配置 | IBMメインフレーム、モトローラMC68000、SPARC |
リトルエンディアン | 最下位バイトから、アドレスの小さい順に配置 | DEC VAX、インテルx86、Appleシリコン |
バイエンディアン | ビッグエンディアンとリトルエンディアンを切り替え可能 | PowerPC、ARM(デフォルトはリトルエンディアン) |
仮想マシンなどでは、プラットフォームに応じてエンディアンを使い分ける設計や、特定のエンディアンに統一する設計があります。例えば、
Java仮想マシンはプラットフォームに関わらずビッグエンディアンを採用しています。
ミドルエンディアン
理論上、バイトオーダにはビッグエンディアンとリトルエンディアン以外にも複数の可能性があります。しかし、現在ではビッグエンディアンかリトルエンディアンに収束しています。
過去には、DECのPDP-11の32ビットワードが、リトルエンディアンの16ビットワードをビッグエンディアンで配置するという、複合的な形式を採用していました。このような複合的なエンディアンをミドルエンディアンと呼ぶことがあります。
バイトオーダの実例
4バイトの数値 `0x01234567` をメモリに格納する例を、各エンディアンで比較してみましょう。
エンディアン | メモリ配置 (左がアドレス小) |
---|
:---- | :----------- |
ビッグエンディアン | `0x01` `0x23` `0x45` `0x67` |
リトルエンディアン | `0x67` `0x45` `0x23` `0x01` |
PDP-11エンディアン | `0x23` `0x01` `0x67` `0x45` |
エンディアン判定プログラム
以下は、
C言語で記述されたエンディアンを判定するプログラムの例です。
c
include
int main() {
int num = 1;
char
ptr = (char )#
if (
ptr == 1) {
printf("リトルエンディアンです.
");
} else {
printf("ビッグエンディアンです.
");
}
return 0;
}
ビットオーダ
1バイト未満のビット単位の並び順序であるビットオーダも存在しますが、プログラマが直接意識する必要はほとんどありません。シリアル通信など、特定のケースではビットの並び順を考慮する必要がありますが、これはCPUの実装ではなく、通信プロトコル上の規定です。
相互運用
異なるエンディアンのコンピュータ間でのデータ交換では、エンディアンの違いを考慮する必要があります。TCP/IPなどのネットワークプロトコルでは、ビッグエンディアンが採用されています(ネットワークバイトオーダ)。
ハードディスクドライブやソリッドステートドライブなどのストレージデバイスも、接続規格によってエンディアンが定められています。例えば、SASはビッグエンディアン、SATAはリトルエンディアンです。
画像や音声などのデータフォーマットでは、エンディアンを事前に規定したり、ファイルヘッダなどにエンディアン情報を格納したりすることがあります。
Unicodeの多バイト文字コード(主にUTF-16)では、エンディアンが問題になります。この問題を解決するために、バイト順マーク(BOM)と呼ばれる特殊なコードが使われます。BOMがない場合は、通常ビッグエンディアンとして扱われます。しかし、エンディアンを固定したUTF-16BEやUTF-16LEも存在し、Windows上の「Unicodeテキスト」ではBOMがない場合UTF-16LEとして扱われます。
日付表現とエンディアン
エンディアンは日付の表現にも適用されます。例えば、2021年4月12日は以下のようになります。
ビッグエンディアン (年月日の順): 2021/04/12 (
中国、日本、韓国など)
リトルエンディアン (日月年の順): 12/04/2021 (英国、フランス、ドイツ、イタリア、ロシアなど)
ミドルエンディアン (月日年の順): 04/12/2021 (米国)
日付の国際規格である
ISO 8601では、ビッグエンディアン(年月日の順)のみが認められており、「/」ではなく「-」で区切る必要があります(例: 2021-04-12)。
エンディアンの語源
ビッグエンディアンとリトルエンディアンという名前は、ジョナサン・スウィフトの小説『
ガリヴァー旅行記』に登場する、
ゆで卵の割り方で対立する人々のエピソードに由来します。この言葉を
コンピュータの世界に持ち込んだのは、ダニー・コーエンです。
まとめ
エンディアンは、
コンピュータの内部データ表現における重要な概念であり、異なるエンディアンのシステム間でデータをやり取りする際には、この違いを意識する必要があります。特に、ネットワーク
通信、ファイル形式、
Unicodeなどの分野で注意が必要です。