← SEARCHABLE ARCHIVE
Computer Science · 2026-05-16

ビッグエンディアンとリトルエンディアンとは何ですか?

なぜバイト格納順序を逆にするのですか?

INTERACTIVE READING MODE →

本ブログ作成文は、講義を目指して製作されました。 また、作成された文章の情報も間違っている可能性がありますので、ご注意ください。

コード化すると、ネットワークにデータを送信したり、特定のファイルを読み込んだり、 値が私の考えと違って完全にひっくり返って出てくる場合がある。 この現象を正式名称でEndianness(エンディアン)配列方式、 つまり、Big Endian(ビッグエンディアン)とLittle Endian(リトルエンディアン)と呼ぶ。

CPUは4バイトのint型データをメモリに保存するとき、丸ごと選んで入れずに1バイトずつ割ってアドレスに順番に入れる。 このとき、最大桁数(MSB)から順に入れるか、最小桁数(LSB)から逆順に入れるかによって データがメモリに配置される形状は完全に異なります。

人が数字を読むように直感的な順序で入れればビッグエンディアン、機械が操作しやすく逆に入れればリトルエンディアンだ。 私たちが主に使うIntelやAMD CPUなど現代PCはほとんどリトルエンディアン方式を採用している。

コードで直接確認してみましょう。

#include <iostream>
#include <iomanip>

int main() {
    //4バイトサイズの16進整数型データ
    unsigned int number = 0x12345678;

    //メモリに1バイトずつどのように格納されているかを確認するためのポインタキャスト
    unsigned char* bytePtr = reinterpret_cast<unsigned char*>(&number);

    for (int i = 0; i < sizeof(int); ++i) {
        std::cout << "&bytePtr[" << i << "] : 0x"
                  << std::hex << std::setw(2) << std::setfill('0')
                  << (int)bytePtr[i] << std::endl;
    }

    /*
     * リトルエンディアンシステム基準
     * &bytePtr[0] : 0x78 //最小単位(LSB)が最下位アドレスに最初に入る
     * &bytePtr[1] : 0x56
     * &bytePtr[2] : 0x34
     * &bytePtr[3] : 0x12
     *
     * ビッグエンディアンシステム基準
     * &bytePtr[0] : 0x12 //最大単位(MSB)が最も低いアドレスに最初に入る
     * &bytePtr[1] : 0x34
     * &bytePtr[2] : 0x56
     * &bytePtr[3] : 0x78
     */

    return 0;
}

ここで気になる点がある。とにかく同じ値を保存するのですが、 あえてなぜリトルエンディアンのようにデータを裏返して保存する非直観的な方式を採用したのか? これはCPU内部の加算器(Adder)設計と形変換(Type Casting)効率性のためだ。

CPUが2つの数字を足したり減算したりすると、1桁、つまり最小の桁数から計算しなければ、切り捨て(Carry)処理が可能である。 リトルエンディアンは、最小単位(LSB)がメモリの最初のアドレスにあるため、 CPUがメモリを読むとすぐに算術演算を開始できる。 また、4 Byte定数を1 Byte(char)に切り出すダウンキャストをするときも 追加のアドレスを計算せずにメモリの開始アドレスだけをそのまま引き抜けば良いので、ハードウェアロジックが非常に単純になる。

一方、ビッグエンディアンはメモリダンプを目で見ると人が読んで直感的で、 二つの数字の大小比較をするときは、前から比較するので有利であるという利点がある。 だから、データをやりとりするときに混乱が来ないように、 インターネットプロトコル(TCP / IP)などのネットワーク標準通信では、ビッグエンディアン方式を標準として使用しています。