Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

ビッグエンディアン(ビッグエンディアン)とは | 意味や読み方など丁寧でわかりやすい用語解説

ビッグエンディアン(ビッグエンディアン)の意味や読み方など、初心者にもわかりやすいように丁寧に解説しています。

作成日: 更新日:

読み方

日本語表記

ビッグエンディアン (ビッグエンディアン)

英語表記

big-endian (ビッグエンディアン)

用語解説

ビッグエンディアンは、コンピュータのメモリ上で複数バイトにわたるデータを格納する際のバイト順序(バイトオーダー)の一種である。バイト順序とは、例えば整数や浮動小数点数といった2バイト以上のデータを、メモリの連続したアドレス空間にどのように配置するかという規則を指す。ビッグエンディアン方式では、データの最上位バイト、すなわち最も大きな桁を表すバイトから順に、メモリの低いアドレスから高いアドレスへと格納していく。

具体的に説明すると、ある多バイトの数値データがある場合、その数値の最も価値の高い部分(最上位バイト、Most Significant Byte: MSB)がメモリ上の最も低いアドレスに配置され、次に価値の高いバイトがその次のアドレスに、といった具合に順次格納されていく。これは私たちが日常的に数字を書く方法、例えば「12345678」という数字を左から右に読むように、最も価値のある桁から順に記述していく感覚と一致する。したがって、人間が直感的にデータを解釈しやすい順序であると言える場合が多い。

このビッグエンディアン方式は、リトルエンディアンという別のバイト順序方式と対をなす概念である。リトルエンディアンでは、データの最下位バイト(Least Significant Byte: LSB)から順に低いアドレスに格納していくため、データの並び順がビッグエンディアンとは逆になる。コンピュータシステムは、そのアーキテクチャや設計思想によってビッグエンディアンまたはリトルエンディアンのどちらか一方、あるいは両方に対応するバイエンディアン方式を採用している。このバイト順序の違いは、特に異なる種類のシステム間でデータを交換する際に問題となる「エンディアン問題」を引き起こす要因となる。

詳細に、ビッグエンディアンでのデータ格納の仕組みを見ていこう。例えば、4バイト(32ビット)の整数値である16進数の「0x12345678」をメモリに格納する場合を考える。この数値は、バイト単位で見ると「0x12」「0x34」「0x56」「0x78」という4つのバイトに分解できる。ここで、「0x12」が最上位バイト、「0x78」が最下位バイトとなる。

ビッグエンディアンの規則に従うと、この数値はメモリ上の連続したアドレスに以下のように格納される。 もし先頭のアドレスが0x1000だとすると:

  • アドレス 0x1000 には 最上位バイトの「0x12」が格納される。
  • アドレス 0x1001 には 次のバイトの「0x34」が格納される。
  • アドレス 0x1002 には 次のバイトの「0x56」が格納される。
  • アドレス 0x1003 には 最下位バイトの「0x78」が格納される。

このように、メモリ上の低いアドレスから順に「0x12, 0x34, 0x56, 0x78」と格納されるため、メモリダンプなどを直接読んだ際に、私たちが普段記述する数字の並びと一致するため、比較的に理解しやすい。

これに対して、もし同じ「0x12345678」というデータをリトルエンディアン方式で格納した場合、メモリ上の並びは「0x78, 0x56, 0x34, 0x12」となる。最下位バイトから順に低いアドレスに格納されるため、ビッグエンディアンとは完全に逆の順序になるのである。システムがデータを読み出す際には、それぞれのエンディアン方式に従ってバイトを結合し、本来の数値を復元する。したがって、あるシステムがビッグエンディアンで格納されたデータをリトルエンディアンで解釈しようとすると、バイト順序が入れ替わってしまい、全く異なる数値として認識されてしまうという問題が発生する。

ビッグエンディアンは、かつて多くのUNIXワークステーションで採用されていたMotorola 68k系プロセッサや、SPARCプロセッサ、PowerPCプロセッサの一部などで採用されてきた歴史がある。特に重要な採用例としては、ネットワークプロトコルが挙げられる。TCP/IPプロトコルスイートは、すべてのデータがビッグエンディアン形式で送信されることを前提としており、これは「ネットワークバイトオーダー」とも呼ばれる。

なぜネットワークプロトコルでビッグエンディアンが採用されたのかというと、データが物理的なネットワーク上を流れる際に、最上位バイトから順にビットが送出されるのが自然な形だからである。これにより、送信側と受信側の間でデータの解釈が統一され、異なるエンディアン方式を持つシステム間でもスムーズなデータ交換が可能になる。例えば、あるシステムがリトルエンディアンであっても、ネットワークにデータを送る際にはビッグエンディアンに変換し、逆にネットワークからデータを受け取る際には自システムのエンディアンに変換するという処理が行われる。この変換処理は「バイトスワップ」と呼ばれ、プログラミングにおいては特定のAPI(例: htonshtonlntohsntohlなどの関数)を用いて行われることが一般的である。これらの関数は、ホストバイトオーダー(システムのエンディアン)とネットワークバイトオーダー(ビッグエンディアン)の間で、16ビット(short)や32ビット(long)のバイト順序を変換する役割を担う。

ビッグエンディアンという名称は、「大きな(most significant)端(end)」、つまり最も大きな桁のバイトがデータの先頭に位置するという意味合いからきている。このデータの並び順は、コンピュータシステムを設計する上での基本的な選択の一つであり、そのシステムの互換性や通信方式に大きな影響を与えるため、システムエンジニアを目指す上で理解しておくべき重要な概念である。異なるアーキテクチャや用途に応じた設計思想が反映されており、適切にデータを扱うためには、現在利用しているシステムや通信相手のエンディアン方式を常に意識する必要がある。

関連コンテンツ

関連ITニュース