導入

コンピューティングでは、整数などの特定のデータを数バイトにわたって表現できます。これらのバイトがメモリ内または通信内で編成される順序は、エンディアンネス(「エンディアン主義」または「エンディアン主義」と訳される英語の単語) と呼ばれます。
人間の言語には、左から右に書かれる言語もあれば、右から左に書かれる言語もあるのと同じように、データを表すバイトの構成には、ビッグエンディアン指向とリトルエンディアン指向という主要な代替手段があります。これらの式は、ビッグエンディアンおよびリトルエンディアンとして翻訳されることがあります。バイト オーダー、オクテットの順序、またはバイト セックスという表現も使用されます (ただし、正確な 8 ビットの数値ベースの単位を指しますが、より一般的な用語であるエンディアンでは翻訳されません)。
エンディアンネスは、ファイル(バイトの順序が異なる) とプロセッサ(ビット管理にも順序がある) の両方を修飾します。
語源
ビッグエンディアンとリトルエンディアンという用語は、ジョナサン・スウィフトの『ガリバー旅行記』から借用されたもので、この小説では、リリプティアンの 2 つの氏族が、ゆで卵を割る異なる方法 (ビッグ エンディアンとリトル エンディアン) をめぐって戦争を繰り広げます。フランス語の翻訳では、一般に、ビッグエンディアンとリトルエンディアンという用語が与えられています。ただし、計算では、接尾辞 -iste が -ien よりも優先して使用されます。
コミュニケーションにおいて
これを NUXI 問題と呼びます。実際、異なる規則を持つマシン上で 16 ビット整数ワードごとに 2 バイトをグループ化して文字列「UNIX」を送信したい場合、NUXI が得られます。この問題は、初期のUnixバージョンのPDP-11ミドルエンディアンをIBMビッグエンディアンアーキテクチャに移植しようとしたときに発見されました。
IP プロトコルは、標準であるネットワーク バイト順序(またはネットワーク バイト順序) を定義します。このプロトコルでは、バイナリ情報は一般にパケットにエンコードされ、ホスト プロセッサの自然なエンディアンに関係なく、最上位バイトから、つまりビッグ エンディアンモードでネットワーク経由で送信されます。
また、システムの一貫性を確保するために、デバイスは規則を遵守する必要があります。これらはすべて、 OSI モデルのリンク層プロトコルによって修正されます。
コンピュータ内
ビッグエンディアン
一部のコンピューターでは、32 ビット整数 (16 進数表記の0xA0B70708など) をメモリに保存する場合、 A0 B7 07 08の順序でバイト単位で保存します。これは、1 バイトの原子単位とアドレス増分に基づくメモリ構造の場合です。 1バイトの。したがって、最上位バイト (ここではA0 ) は最小のメモリ アドレスに格納され、最下位バイト (ここではB7 ) は次のメモリ アドレスに格納され、以下同様になります。
0 | 1 | 2 | 3 | ||
... | A0 | B7 | 07 | 08 | ... |
2 バイトの原子単位に基づくメモリ構造または通信プロトコルの場合、アドレス増分は 1 バイトで、バイト単位のレコードはA0B7 0708になります。最上位の原子単位 (ここではA0B7 ) は最小のメモリ アドレスに記録されます。
0 | 1 | 2 | 3 | ||
... | A0 | B7 | 07 | 08 | ... |
この規則を遵守するアーキテクチャは、ビッグ エンディアン、またはビッグ エンディアン、または上位ワードと呼ばれます。たとえば、 Motorola 68000プロセッサ、 SPARC (Sun Microsystems)、System/370 (IBM) などです。
リトルエンディアン
他のコンピューターは、 0xA0B70708次の順序で記録します: 08 07 B7 A0 (1 バイトのアトミック単位と 1 バイトのアドレス増分に基づくメモリ構造の場合)、つまり最下位バイトが最初です。このようなアーキテクチャは、リトル エンディアン、または先頭のリトル エンディアンまたは下位ワードと呼ばれます。たとえば、PC に搭載されているx86プロセッサは、リトル エンディアンアーキテクチャを備えています。
0 | 1 | 2 | 3 | ||
... | 08 | 07 | B7 | A0 | ... |
2 バイトの原子単位に基づくメモリ構造または通信プロトコルの場合、アドレス増分は 1 バイトで、バイト単位のレコードは0708 A0B7になります。最下位アトミック単位 (ここでは0708 ) は最小のメモリ アドレスに格納されます。
0 | 1 | 2 | 3 | ||
... | 07 | 08 | A0 | B7 | ... |
バイエンディアン
PowerPC (IBM)、ARM、DEC Alpha、MIPS、PA-RISC (HP)、IA-64 (Intel) アーキテクチャなど、一部のアーキテクチャは両方のルールをサポートしています。彼らはバイトセクシュアル(専門用語)、バイエンディアン、またはよりまれにビブーティストと呼ばれます。モードの選択は、ソフトウェアレベル、ハードウェア レベル、またはその両方で行うことができます。
ミドルエンディアン
ミドルエンディアンと呼ばれる他のまれなアーキテクチャでは、より複雑な順序付けが行われます。つまり、アトミック ユニットを構成するバイトがスワップ操作を受けます。たとえば、 0xA0B70708 、アトミック単位が 2 バイトで、アドレスが 1 バイトずつ増加するミドルエンディアン メモリに、 0807 B7A0またはB7A0 0807の順序で記録されます。
0 | 1 | 2 | 3 | |||
... | 08 | 07 | B7 | A0 | ... | ミドルエンディアン、2 バイトのアトミック単位、1 バイトのアドレス増分 |
またはその代わりに
0 | 1 | 2 | 3 | |||
... | B7 | A0 | 08 | 07 | ... | ミドルエンディアン、2 バイトのアトミック単位、1 バイトのアドレス増分 |
このデータの表現にはあいまいさがあります。実際、アトミック単位の順序付けに関するエンディアン情報はまだ存在します。したがって、ミドルエンディアンという用語については、バイトスワップ特性に関連するビッグエンディアンまたはリトルエンディアンという用語を使用します。これにより、例は明確になります。
1.バイトスワップ、2 バイトのアトミック単位、1 バイトのアドレス増分を備えたリトルエンディアン メモリでは、 0xA0B70708は0807B7A0で表され、 08はアドレス0にあります。
0 | 1 | 2 | 3 | |||
... | 08 | 07 | B7 | A0 | ... | リトルエンディアン、バイトスワップ、アトミックユニット 2 バイト、アドレスインクリメント 1 バイト |
2.バイトスワップ、2 バイトのアトミック単位、1 バイトのアドレス増分を備えたビッグエンディアン メモリでは、 0xA0B70708 B7A00807で表され、 B7アドレス0にあります。
0 | 1 | 2 | 3 | |||
... | B7 | A0 | 08 | 07 | ... | ビッグエンディアン、バイトスワップ、アトミックユニット 2 バイト、アドレスインクリメント 1 バイト |
このようなプロセッサ、たとえば PDP-11 を使用するのはさらに困難です。
ビット順序
ビッグ エンディアンアーキテクチャにおけるビットの番号付けは次のとおりです。ビットは左から番号付けされるため、バイト内ではビット0 が最も重要で、ビット 7 が最も重要ではありません。ただし、バイトが 2 進小数を表す必要がある場合は、ビッグエンディアン規則の方が適しています。
2 つの表記の混同を避けるための覚えやすい方法は、「エンディアン」を「ヘッド」に置き換えることです。すると、次のようになります。
- 「big head」の重要ビットの場合は「big head」、
- 「ローヘッド」重要ビットの場合は「リトルヘッド」。
