なぜリトルエンディアンが主流になったか
同じ整数でもCPUによってバイトの並び順が逆になる理由を、x86の市場支配とネットワーク標準の対立から解き明かし、なぜ変換コストが今も残るのかを腹落ちさせる。
- 呼称は『ガリバー旅行記』の卵論争が由来。低位バイトから並べるリトルエンディアンをx86が採用し、PC市場の支配とともに事実上の標準になった。
- 利点は型幅の変換が容易な点。同じ先頭アドレスのまま1/2/4/8バイトとして読み分けられ、下位桁の加算も先頭から始められる。
- 一方でネットワークバイトオーダーはビッグエンディアン固定。両者の分裂により、通信やファイル入出力では今も明示的なバイト順変換が欠かせない。
結論(なぜそうなったのか)
横にスクロール
リトルエンディアンが主流なのは、それが「理論的に優れていた」からではなく、x86 という商業的勝者がそれを採用し、PC 市場を支配したからです。低位バイトを先頭に置く方式には型幅変換や多倍長演算で実装上の小さな利点がありますが、勝敗を決めたのは技術的優劣ではなく市場です。同時に、TCP/IP が定めた「ネットワークバイトオーダー」はビッグエンディアンで固定されたため、世界は「CPU の中はリトル、線の上はビッグ」という分裂を抱えたまま今日に至ります。
当時の状況と競合
エンディアン(endianness)とは、複数バイトからなる数値をメモリ上に並べる順序のことです。32ビット値 0x0A0B0C0D を先頭アドレスから見たとき、次の2流派が対立しました。
| 方式 | 先頭アドレスに来るバイト | 並び | 代表アーキテクチャ |
|---|---|---|---|
| リトルエンディアン | 最下位バイト(0x0D) | 0D 0C 0B 0A | x86 / x86-64、初期ARM、RISC-V |
| ビッグエンディアン | 最上位バイト(0x0A) | 0A 0B 0C 0D | 68k、SPARC、初期PowerPC、ネットワーク |
「エンディアン」という呼称自体が論争の性格を映しています。語源はジョナサン・スウィフトの『ガリバー旅行記』(1726)で、ゆで卵を丸い端(big end)から割るか尖った端(little end)から割るかで国が二分される風刺でした。この語を計算機用語に持ち込んだのは Danny Cohen の 1980 年の論文 "On Holy Wars and a Plea for Peace" です。Cohen の主眼は「どちらが正しいかを決めることに意味はなく、標準を1つ選んで従うことが重要だ」という点にありました。
ビッグエンディアンには「人間が数字を書く順(大きい桁が左)と一致し読みやすい」という直感的な利点があり、IBM メインフレームや Motorola 68000、初期のインターネット関連 RFC はこちらを採りました。一方リトルエンディアンは、DEC の PDP-11 や Intel の 8080/8086 系が採用しました。
決定打・経緯
リトルエンディアンには、低レイヤ実装で効く実利がありました。
- 型幅変換が容易: 同じ先頭アドレスを指したまま、その値を1バイト・2バイト・4バイト・8バイトのどれとして読むかを選べます。下位バイトが常に先頭にあるため、
longをshortとして読んでもアドレスを補正する必要がありません。ビッグエンディアンでは幅が変わるとオフセットがずれます。 - 多倍長演算の自然さ: 加算は最下位桁から桁上がりしていくので、下位バイトが先頭にある方が「先頭から順に処理する」実装と相性が良い。
ただし現代の CPU ではこれらの差はほぼ無視できる水準で、利点だけでは主流化を説明できません。決定打はビジネスです。Intel 8086 (1978) がリトルエンディアンを採り、IBM PC (1981) がその系譜の 8088 を採用しました。以後 PC 市場は x86 命令セットの後方互換を軸に爆発的に拡大し、エンディアンもその互換性の一部として固定されました。ワークステーションやゲーム機で優勢だったビッグエンディアン勢(SPARC、68k、PowerPC)は市場縮小とともに退場し、Apple ですら 2006 年に PowerPC から x86 へ移行してリトルエンディアンへ転じました。
ARM は興味深い立ち位置です。元々バイエンディアン(両対応、切替可能)として設計されましたが、実運用のエコシステム——Linux ディストリビューション、Android、各種バイナリ——が圧倒的にリトルエンディアンへ寄ったため、事実上リトルエンディアンで運用されるのが標準になりました。RISC-V も既定はリトルエンディアンです。こうして「CPU の中身はリトルエンディアン」がほぼ世界標準になりました。
TCP/IP のヘッダ(IP アドレス、ポート番号、各種長さフィールド)はビッグエンディアンで定義されており、これを「ネットワークバイトオーダー」と呼びます。理由は単純で、標準が固まった 1980 年前後の主要ホストや RFC の記法がビッグエンディアン優勢だったからです。一度プロトコルに焼き付いた並び順は、互換性を壊せないため凍結されます。結果として、リトルエンディアンの CPU は通信のたびに変換が必要になりました。
C 言語ではこの変換を htons / htonl(host to network)と ntohs / ntohl(network to host)で行います。リトルエンディアン機ではバイト入れ替えが走り、ビッグエンディアン機では恒等(何もしない)になります。
uint16_t port = 8080; // ホスト表現
uint16_t wire = htons(port); // 線に載せる並び(ビッグエンディアン)へ変換
// リトルエンディアン機では 0x1F90 -> 0x901F にバイトが入れ替わる
今への影響と教訓
この分裂は、今も実務で具体的なコストとして現れます。
- 通信・シリアライズでの明示変換: ソケット通信、独自バイナリプロトコル、ファイルフォーマットでは、バイト順を規約で固定し、読み書き時に変換する必要があります。怠ると、リトルとビッグのマシン間でデータが化けます。
- バグの再現性の低さ: 開発機がリトル、本番の一部がビッグだと、
memcpyで整数をそのまま送るような実装は片方でしか壊れず、発見が遅れます。 - ファイル・フォーマットに残る指紋: Unicode の BOM(Byte Order Mark)や、UTF-16/32 に LE/BE の別があるのは、この論争がフォーマット層まで及んでいる証拠です。
- リトルエンディアン=最下位バイトが先頭。ビッグエンディアン=最上位バイトが先頭
- 呼称の由来は『ガリバー旅行記』の卵論争(Danny Cohen が計算機用語化)
- x86/x86-64 はリトル、ネットワークバイトオーダーはビッグで固定
- ARM・RISC-V は既定リトル(ARM は元々バイエンディアン)
- 変換は htons/htonl・ntohs/ntohl。ビッグエンディアン機では恒等になる
普遍の教訓は、標準は「最善」ではなく「最初に十分広まったもの」が勝ち、いったん互換性の制約として凍結されると変換コストが恒久的に残るという点です。Cohen が 1980 年に指摘した「どちらでもよいから1つに揃えよ」は正しかったのですが、CPU 陣営とプロトコル陣営がそれぞれ別々に「1つ」を選んでしまったために、私たちは今も両者を橋渡しし続けています。
CPU がメモリをどう扱うかの土台はOSを、こうした低レイヤ表現がコードにどう現れるかはプログラミングを、ネットワークバイトオーダーが効いてくる通信の仕組みはネットワークを参照してください。
なぜ?の記事ガイド
なぜリトルエンディアンが主流になったかを実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
エンディアン
比較で見る軸
難易度: advanced / カテゴリ: なぜ? / タグ数: 6
導入後に効く点
利点は型幅の変換が容易な点。同じ先頭アドレスのまま1/2/4/8バイトとして読み分けられ、下位桁の加算も先頭から始められる。
先に潰すリスク
用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。
- 難易度
- advanced
- カテゴリ
- なぜ?
- タグ数
- 6
判断チェックリスト
- 自社の用途が「エンディアン / x86」に近いか確認する。
- 強みである「呼称は『ガリバー旅行記』の卵論争が由来。低位バイトから並べるリトルエンディアンをx86が採用し、PC市場の支配とともに事実上の標準になった。」が本当に評価軸になるか確認する。
- 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。