エンディアン

ビッグエンディアンとリトルエンディアンの比較図

コンピュータ科学において、エンディアンとは、ワードデータ型内のバイトがデータ通信媒体を介して送信される順序、またはコンピュータメモリ内でアドレス指定される順序のことであり、バイトの重要度のみを基準として、その早さを基準とします。エンディアンは主にビッグエンディアンBE)またはリトルエンディアンLE )で表されます。

コンピュータは、情報を様々なサイズのバイナリビットのグループに格納します。各グループには、コンピュータがデータにアクセスするために使用するアドレスと呼ばれる番号が割り当てられます。ほとんどの現代のコンピュータでは、アドレスを持つ最小のデータグループは8ビット長で、バイトと呼ばれます。より大きなグループは2バイト以上で構成されます。例えば、32ビットのワードは4バイトで構成されます。

コンピュータが大きなグループ内の個々のバイトを、どちらかの端から順に番号付けする方法は主に2つあります。ビッグエンディアン方式では、ワードの最上位バイトを最小のメモリアドレスに、最下位バイトを最大のメモリアドレスに格納します。一方、リトルエンディアン方式では、最下位バイトを最小のアドレスに格納します。[ 1 ] [ 2 ] [ 3 ] 2つの方式のうち、ビッグエンディアンは、数字をバイトに換算し、アドレスが左から右に増加すると仮定した英語で左から右に数字を表記する方法に近いです。

どちらのタイプのエンディアンは、デジタル電子工学で広く使用されています。新しい設計におけるエンディアンの初期の選択は多くの場合任意ですが、その後の技術改訂や更新では、下位互換性を維持するために既存のエンディアンが永続化されます。ビッグエンディアンは、インターネットプロトコルスイートなどのネットワークプロトコルで支配的な順序付けであり、ネットワークオーダーと呼ばれ、最上位バイトを最初に送信します。逆に、リトルエンディアンは、プロセッサアーキテクチャ(x86、ほとんどのARM実装、基本RISC-V実装)とそれに関連するメモリで支配的な順序付けです。ファイル形式はどちらかの順序付けを使用できます。一部の形式では、両方が混在していたり​​、ファイル全体でどの順序付けが使用されているかを示すインジケータが含まれています。[ 4 ]

バイエンディアンは、データのフェッチとストア、あるいは命令フェッチにおいて切り替え可能なエンディアンを備えた多くのコンピュータアーキテクチャでサポートされている機能です。その他の順序は、一般的にミドルエンディアンまたは混合エンディアンと呼ばれます。[ 5 ] [ 6 ] [ 7 ] [ 8 ]

起源

最もよく知られている小説『ガリバー旅行記』は、「ビッグエンディアン」と「リトルエンディアン」という用語の起源です。1726年版の扉絵には、著者ジョナサン・スウィフトが描かれています。

エンディアンは主にビッグエンディアン(BE)またはリトルエンディアン(LE)として表現され、1980年に出版されたインターネット実験ノートダニー・コーエンが導入した用語である。 [ 9 ]コーエンはジョナサン・スウィフトの風刺小説『ガリヴァー旅行記』の不条理なエピソードからこれらの用語を借用した。架空の国リリパットでは、ゆで卵の殻を正しく割る方法について、学者たちが終わりのない議論で激しく分裂している。殻の大きい端を割ることを主張する学者はビッグエンディアンであり、殻の反対側を割る学者はリトルエンディアンである。[ 10 ] [ 11 ]

特徴

コンピュータメモリは、記憶セル(アドレス指定可能な最小単位)の列で構成されています。バイトアドレス指定をサポートするマシンでは、これらの単位はバイトと呼ばれます。各バイトは、ハードウェアおよびソフトウェアによってメモリアドレスによって識別され、アクセスされます。メモリ内のバイトの総数がnの場合、アドレスは 0 からn  − 1 まで番号付けされます。

コンピュータプログラムは、1バイトに格納できる以上のデータで構成されるデータ構造やフィールドをしばしば使用します。本稿の文脈では、フィールドの型が任意に複雑になることは許されませんが、フィールドは連続したバイト列で構成され、少なくとも潜在的には1つハードウェア命令で操作可能な単純なデータ値を表します。ほとんどのシステムでは、複数バイトの単純なデータ値のアドレスは、その最初のバイト(アドレスが最も低いバイト)のアドレスです。この規則には例外があります。例えば、IBM 1401のAdd命令は、可変長フィールドを下位(最上位アドレス)位置でアドレス指定し、その長さは上位(最下位アドレス)位置に設定されたワードマークによって定義されます。加算などの演算を実行する場合、プロセッサは2つのフィールドの上位アドレスの下位位置から開始し、上位アドレスへと進んでいきます。[ 12 ]

バイトがフィールドの一部であることのもう一つの重要な属性は、その重要性です。フィールドを構成する各要素のこれらの属性は、コンピューターハードウェア、より正確には、コンピューター命令の結果に寄与する低レベルアルゴリズムによってバイトがアクセスされる順序において重要な役割を果たします。

数字

位置記数法(主に2進法、まれに10進法)は、コンピュータによる整数データの表現、特に操作において主流の方法です。純粋な形式では、これは中程度のサイズの非負整数(例えばC言語のデータ型)に有効ですunsigned。このような記数法では、整数を構成する桁のは、その桁単体の値だけでなく、その桁が整数全体の中で占める位置(重要度)によっても決まります。これらの位置は、主に2つの方法でメモリにマッピングできます。[ 13 ]

  • メモリアドレスが増加するにつれて数値の重みが減少する方式(ビッグエンディアン)と
  • メモリ アドレスが増加すると数値の重みも増加します。これはリトルエンディアンと呼ばれます。

ビッグ エンディアンリトルエンディアンでは、終了は、最も低いメモリ アドレスによってインデックス付けされた場所に 大きいまたは小さい意味が書き込まれる端点です。

文章

例えばソートなどのメカニズムをサポートするために文字列(テキスト)を互いに比較する場合、単一の位置要素(文字)が位置値も持つ辞書式比較が頻繁に行われます。辞書式比較は、ほとんどすべての場合に当てはまります。電話帳のように、最初の文字が最も高いランクになります。これを単一の命令で実行できるマシンは、ほぼすべてビッグエンディアン、または少なくとも混合エンディアンです。

テキストとして書き込まれた整数は、テキストの方向に関係なく、常にメモリ内で最上位桁が最初に表されます。これはビッグエンディアンに似ています。

バイトアドレス指定

メモリバイトを左から右へ順番に出力する場合(例えば、16進ダンプ)、整数のリトルエンディアン表現では、右から左へ向かって意味が増していきます。つまり、視覚的に見ると逆順に表示され、直感に反する場合があります。

この動作は、例えばFourCCや、文字を整数にパックしてメモリ内で特定の文字のシーケンスにする類似の技術で発生します。例えば、16進ASCIIで格納された文字列「JOHN」を考えてみましょう。ビッグエンディアン方式のマシンでは、値は左から右に表示され、結果を読み取るための正しい文字列順序(「JOH N」)と一致します。しかし、リトルエンディアン方式のマシンでは、「NHO J」と表示されます。ミドルエンディアン方式のマシンでは、この動作はさらに複雑になります。例えば、PDP-11では、32ビットの値がビッグエンディアン方式では2つの16ビットワード「JO」「HN」として格納され、16ビットワード内の文字はリトルエンディアン方式で格納されるため、「OJN H」となります。[ 14 ]

バイトスワッピング

バイトスワッピングとは、バイトの順序を並べ替えてエンディアンを変更することです。多くのコンパイラは、 などのネイティブプロセッサ命令 ( / )にコンパイルされる可能性のある組み込み関数を提供しています。スワッピングのためのソフトウェアインターフェースには、次のようなものがあります。 bswapmovbe__builtin_bswap32

  • 標準ネットワークエンディアン関数(BEから/へ、最大32ビット)。[ 15 ] Windowsには64ビット拡張機能がありますwinsock2.h
  • BSDおよびGlibcendian.h関数(BEおよびLE間、最大64ビット)。[ 16 ]
  • macOSOSByteOrder.hマクロ (BE および LE 間、最大 64 ビット)。
  • C++23std::byteswapの関数。[ 17 ]

一部のCPU命令セットでは、 bswap[ 18 ]x86 - 486以降、i960 - i960Jx以降[ 19 ])、rev[ 20 ]ARMv6以降) など、エンディアンバイトスワッピングをネイティブにサポートしています。

一部のコンパイラには、バイトスワップ機能が組み込まれています。例えば、Intel FortranCONVERTコンパイラは、ファイルを開く際に非標準指定子(例: )をサポートしています。他のコンパイラには、すべてのファイルIO操作に対して変換をグローバルに有効にするコードを生成するオプションがあります。これにより、コードを変更することなく、逆エンディアンを持つシステムでコードを再利用できます。 OPEN(unit,CONVERT='BIG_ENDIAN',...)

考慮事項

フィールドの一部への簡易アクセス

ほとんどのシステムでは、マルチバイト値のアドレスは、その最初のバイト(アドレスが最も小さいバイト)のアドレスです。このタイプのリトルエンディアンシステムでは、十分に小さいデータ値の場合、同じ値を異なる長さでメモリから読み出すことができ、異なるアドレスを使用する必要はありません(アライメント制限が課されている場合でも同様です)。例えば、32ビットのメモリ位置の内容は、 8ビット(値 = 4A)、16ビット(004A)、24ビット(00004A)、または32ビット4A 00 00 00(0000004A)のいずれのアドレスからでも同じ数値を保持しながら読み出すことができます。このリトルエンディアンの特性は、高レベルプログラマが直接使用することはほとんどありませんが、コードオプティマイザーやアセンブリ言語プログラマによって時折採用されています。C++では許可されていませんが、このような型パンニングコードはC11標準[ 21 ]では「実装定義」として許可されており、ハードウェアと対話するコードでは一般的に使用されています[ 22 ][ 23 ]

計算順序

位置記法における一部の演算には、基本ステップを実行するための自然な順序、あるいは優先順序があります。この順序は、小規模なバイトアドレス指定可能なプロセッサやマイクロコントローラではパフォーマンスに影響を与える可能性があります。しかし、高性能プロセッサは通常、1バイトのフェッチと同じ時間でメモリからマルチバイトのオペランドをフェッチするため、ハードウェアの複雑さはバイト順序の影響を受けません。

加算、減算、乗算は最下位桁から始まり、桁上げを次の上位桁に伝播します。ほとんどのシステムでは、マルチバイト値のアドレスは、その最初のバイト(アドレスが最も小さいバイト)のアドレスです。これらの演算の実装は、この最初のバイトに最下位桁が含まれるリトルエンディアン方式のマシンでは、わずかに簡単になります。

比較と除算は最上位桁から開始され、桁上がりが発生した場合は下位桁に伝播します。固定長の数値(通常、長さ1、2、4、8、16)の場合、これらの演算の実装はビッグエンディアンマシンの方がわずかに単純になります。

一部のビッグエンディアン プロセッサ (IBM System/360 およびその後継機など) には、可変長文字列を辞書順に比較するためのハードウェア命令が含まれています。

代入文による通常のデータ転送は、原則として、プロセッサのエンディアンとは無関係です。

ハードウェア

多くの歴史的および現存するプロセッサは、排他的にまたは設計オプションとして、ビッグエンディアンのメモリ表現を使用しています。IBM System/360 はビッグエンディアンバイトオーダーを使用しており、その後継機であるSystem/370ESA/390z/Architectureも同様です。PDP-10 は、バイト指向の命令にビッグエンディアンアドレス指定を使用します。IBM Series/1ミニコンピュータはビッグエンディアンバイトオーダーを使用します。 Motorola 6800 / 6801、6809、および68000 シリーズのプロセッサはビッグエンディアン形式を使用します。 ビッグエンディアン専用のアーキテクチャには、IBM z/Architecture とOpenRISCがあります。ただし、 PDP-11ミニコンピュータは、その後継機であるVAXと同様にリトルエンディアンバイトオーダーを使用しています。

Datapoint 2200は、キャリー伝播を容易にするために、リトルエンディアンを採用したシンプルなビットシリアルロジックを採用していました。IntelがDatapoint向けに8008マイクロプロセッサを開発したとき、互換性のためにリトルエンディアンを採用しました。しかし、Intelが8008を期限までに納品できなかったため、Datapointは中規模規模の同等のプロセッサを使用しました。しかし、 MCS-48、8086 そしてIA-32およびx86-64プロセッサを含むその後継x86プロセッサなど、ほとんどのIntel設計ではリトルエンディアンが維持されました。[ 24 ] [ 25 ] MOS Technology 6502ファミリー(Western Design Center 65802および65C816を含む)、Zilog Z80 ( Z180およびeZ80を含む)、Altera Nios IIAtmel AVRAndes Technology NDS32、Qualcomm Hexagon、その他多くのプロセッサおよびプロセッサフ​​ァミリーもリトルエンディアンである。

インテル8051は、他のインテルプロセッサーとは異なり、LJMPとLCALLではビッグエンディアン形式の16ビットアドレスを想定しています。ただし、xCALL命令は戻りアドレスをリトルエンディアン形式でスタックに格納します。[ 26 ]

バイエンディアン

一部の命令セットアーキテクチャは、データのフェッチとストア、命令のフェッチ、またはその両方で切り替え可能なエンディアン設定を備えています。これらの命令セットアーキテクチャはバイエンディアンと呼ばれます。切り替え可能なエンディアンをサポートするアーキテクチャには、PowerPC / Power ISASPARC V9、ARMバージョン 3 以上、DEC AlphaMIPSIntel i860PA-RISCSuperH SH-4IA-64C-Sky、およびRISC-Vがあります。この機能により、パフォーマンスが向上し、ネットワークデバイスとソフトウェアのロジックが簡素化されます。 ハードウェアに関してバイエンディアンという言葉は、どちらのエンディアン形式でもデータを計算または渡すことができるマシンの能力を意味します。

これらのアーキテクチャの多くは、ソフトウェアを介して特定のエンディアン形式にデフォルトを切り替えることができます (通常、コンピュータの起動時に実行されます)。ただし、一部のシステムでは、デフォルトのエンディアンはマザーボード上のハードウェアによって選択され、ソフトウェアを介して変更することはできません (例: Cray T3Eでビッグ エンディアン モードでのみ実行される Alpha )。

IBM AIXおよびIBM i は、バイエンディアンの Power ISA 上でビッグエンディアンモードで動作します。Linux元々ビッグエンディアンモードで動作していましたが、2019 年までに IBM は Linux ソフトウェアの x86 から Power への移植を容易にするために Linux をリトルエンディアンモードに移行しました。[ 27 ] [ 28 ] SPARC には関連するリトルエンディアン展開はなく、Oracle Solarisと Linux はどちらもバイエンディアンの SPARC システム上でビッグエンディアンモードで動作し、実際にはビッグエンディアンと見なすことができます。ARM、C-Sky、RISC-V には関連するビッグエンディアンの展開はなく、実際にはリトルエンディアンと見なすことができます。

バイエンディアンという用語は、主にプロセッサがデータアクセスを処理する方法を指します。特定のプロセッサでは、データアクセスが完全にバイエンディアンであっても、命令アクセス(命令ワードのフェッチ)は固定エンディアンとみなされる場合があります。ただし、IntelのIA-64ベースのItanium CPUのように、バイエンディアンとバイエンディアンの両方に対応している場合でも、必ずしもそうとは限りません。

一部のCPUは、名目上はバイエンディアンですが、エンディアンを完全に切り替えるためにマザーボードの支援を必要とします。例えば、32ビットデスクトップ向けPowerPCプロセッサは、リトルエンディアンモードでは実行プログラムからはリトルエンディアンとして動作しますが、 I/Oデバイスにリトルエンディアンのビューが適用されるようにするために、マザーボードは8バイトレーンすべてにわたって64ビットのスワップを実行する必要があります。この特殊なマザーボードハードウェアがない場合、デバイスドライバソフトウェアは、不完全な変換を元に戻すために異なるアドレスに書き込む必要があり、さらに通常のバイトスワップも実行する必要があります。

組み込み用途向けの多くの PowerPC プロセッサやほぼすべての SPARC プロセッサなどの一部の CPU では、ページごとにエンディアンを選択できます。

1990 年代後半以降の SPARC プロセッサ (SPARC v9 準拠プロセッサ) では、メモリからロードしたりメモリに格納したりする個々の命令ごとにデータのエンディアンを選択できます。

ARMアーキテクチャは、 BE-8BE-32という2つのビッグエンディアンモードをサポートしています。[ 29 ] ARMv5までのCPUはBE-32またはワード不変モードのみをサポートしています。このモードでは、自然に整列した32ビットアクセスはリトルエンディアンモードと同様に機能しますが、バイトまたは16ビットワードへのアクセスは対応するアドレスにリダイレクトされ、非整列アクセスは許可されません。ARMv6では、BE-8またはバイト不変モードが導入されました。このモードでは、1バイトへのアクセスはリトルエンディアンモードと同様に機能しますが、16ビット、32ビット、または(ARMv8以降)64ビットワードにアクセスすると、データのバイトスワップが発生します。これにより、非整列メモリアクセスと、32ビット以外のレジスタへのメモリマップアクセスが簡素化されます。

多くのプロセッサには、レジスタ内のワードを反対のエンディアンに変換する命令があります。つまり、16 ビット、32 ビット、または 64 ビットのワード内のバイトの順序を入れ替えます。

最近のIntel x86およびx86-64アーキテクチャCPUにはMOVBE命令(Intel CoreはAtom以降の第4世代以降)が搭載されており[ 30 ] 、これはビッグエンディアン形式のワードをメモリから取得したり、ビッグエンディアン形式でワードをメモリに書き込んだりします。これらのプロセッサは、それ以外は完全にリトルエンディアンです。

場所によって異なるフォーマットを使用するデバイスもあります。例えば、Texas Instruments のバッテリーゲージ BQ27421 は、レジスタにはリトルエンディアン形式を使用し、ランダムアクセスメモリにはビッグエンディアン形式を使用しています。

SPARCは歴史的にバージョン9まではビッグエンディアンを採用していましたが、現在はバイエンディアンです。同様に、初期のIBM POWERプロセッサもビッグエンディアンでしたが、PowerPCPower ISAの後継機種は現在バイエンディアンです。ARMアーキテクチャはバージョン3まではリトルエンディアンでしたが、その後バイエンディアンになりました。

浮動小数点

多くのプロセッサは、すべてのタイプのデータ(整数、浮動小数点)にリトルエンディアン記憶域を使用しますが、浮動小数点数をビッグエンディアン形式で表現し、整数をリトルエンディアン形式で表現するハードウェアアーキテクチャも多数あります。[ 31 ]倍精度数値に対して混合エンディアン浮動小数点表現を持つARMプロセッサがあります。この場合、2 つの 32 ビットワードはそれぞれリトルエンディアンとして格納されますが、最上位ワードが最初に格納されます。VAX浮動小数点では、リトルエンディアンの 16 ビットワードをビッグエンディアンの順序で格納します。 ネットワーク標準表現のない浮動小数点形式が多数存在するため、XDR標準では、表現としてビッグエンディアンの IEEE 754 を使用します。 そのため、広く普及しているIEEE 754浮動小数点標準でエンディアンが指定されていないのは奇妙に思えるかもしれません。[ 32 ]理論上、これは、1 つのマシンで書き込まれた標準 IEEE 浮動小数点データであっても、別のマシンでは読み取れない可能性があることを意味します。しかし、現代の標準的なコンピュータ(つまりIEEE 754を実装しているコンピュータ)では、浮動小数点数と整数のエンディアンは同じであると想定して差し支えなく、データ型に関わらず変換は容易です。ただし、特殊な浮動小数点形式を使用する 小規模な組み込みシステムの場合は、状況が異なります。

可変長データ

これまで検討したほとんどの命令では、オペランドのサイズ (長さ) がオペレーション コード内に含まれています。 よく使用されるオペランドの長さは、1、2、4、8、16 バイトです。 ただし、ワードマークなどを使用して、オペランドの長さを命令の別のフィールドまたはオペランド自体に保持できるアーキテクチャもあります。 このような方法では、最大 256 バイト以上のオペランド長が可能です。 このようなオペランドのデータ型は、文字列またはBCDです。 1 つの命令 (比較、加算など) でこのようなデータを操作できるマシンには、IBM 1401、1410、1620、System /360 System /370ESA/390z/Architectureなどがあり、これらはすべてビッグ エンディアン タイプです。

ミドルエンディアン

一般的にミドルエンディアンまたは混合エンディアンと呼ばれる他の多数の順序付けも可能です。

PDP -11は基本的に16ビットのリトルエンディアンシステムです。PDP-11/45、PDP-11/70、およびそれ以降のプロセッサのオプションの浮動小数点プロセッサにおける浮動小数点値と整数値の変換命令は、32ビットの倍精度整数long値を、16ビットの半分がリトルエンディアンで想定される順序とは逆の順序で格納していました。UNIX Cコンパイラは、32ビットのlong整数に同じ形式を使用していました。この順序はPDPエンディアンとして知られています。[ 33 ]

UNIXは、同じコードを異なる内部表現を持つプラットフォーム向けにコンパイルすることを可能にした最初のシステムの一つでした。最初に変換されたプログラムの一つは を出力するはずでしたUnixが、Series/1では と出力されましたnUxi[ 34 ]

このエンディアンを解釈する方法は、32 ビット整数を 2 つのリトルエンディアンの 16 ビットワードとして、ビッグエンディアンのワード順序で格納することです。

0x0A0B0C0DPDP-11における 32ビット整数の格納
バイトオフセット 8ビット値 16ビットのリトルエンディアン値
0 0Bh0A0Bh
1 0Ah
2 0Dh0C0Dh
3 0Ch

IA-32および互換プロセッサのセグメント記述子は、セグメントの32ビットベースアドレスをリトルエンディアン順序で、記述子の開始の相対位置2、3、4、7に4つの非連続バイトで格納します。[ 35 ]

ソフトウェア

ロジック設計

デジタルロジックを表現するために使用されるハードウェア記述言語(HDL)は、多くの場合、任意の粒度で任意のエンディアンをサポートします。例えば、SystemVerilogでは、ワードをリトルエンディアンまたはビッグエンディアンとして定義できます。

ファイルとファイルシステム

エンディアンネスの認識は、異なるエンディアンネスを持つコンピューターで作成されたファイルまたはファイルシステムを読み取るときに重要です。

一方のエンディアンで作成されたFortranのシーケンシャル書式なしファイルは、通常、もう一方のエンディアンを使用するシステムでは読み取ることができません。これは、Fortranでは通常、レコード(単一のFortran文で書き込まれるデータとして定義されます)が、データの前後にカウントフィールド(データのバイト数に等しい整数)を持つデータとして実装されるためです。もう一方のエンディアンを使用するシステムでFortranを使用してこのようなファイルを読み取ろうとすると、カウントフィールドが正しくないため、実行時エラーが発生します。

Unicodeテキストは、ファイルまたはストリームのエンディアンを示すバイトオーダーマーク(BOM)で始まる場合があります。BOMのコードポイントはU+FEFFです。例えばUTF-32では、ビッグエンディアンのファイルは で始まり00 00 FE FF、リトルエンディアンのファイルは で始まりますFF FE 00 00

MATLAB .matファイルや地形図で使用される.bilデータ形式などのアプリケーションバイナリデータ形式は、通常、エンディアンに依存しません。これは、データを常に固定のエンディアンで保存するか、データにエンディアンを示すスイッチを付加することで実現されます。前者の例としては、Windows システムと Mac システム間で移植可能なバイナリXLS ファイル形式が挙げられます。この形式は常にリトルエンディアンであるため、ビッグエンディアンの Motorola 68K または PowerPC プロセッサ上で実行する場合、Mac アプリケーションは読み込み時と保存時にバイトのスワップが必要になります。[ 36 ]

TIFF画像ファイルは2番目の戦略の例であり、そのヘッダーはアプリケーションに内部バイナリ整数のエンディアンを指示します。ファイルが署名で始まる場合、MM整数はビッグエンディアンで表現され、 はリトルエンディアンで表現されることを意味しますII。これらの署名はそれぞれ16ビットワードを1つ必要とし、回文であるため、エンディアンに依存しません。はIntelIを表し、 はMotorolaを表します。Intel CPUはリトルエンディアンですが、Motorola 680x0 CPUはビッグエンディアンです。この明示的な署名により、TIFFリーダープログラムは、異なるエンディアンのコンピュータで実行されているTIFFライタープログラムによって特定のファイルが生成された場合、必要に応じてバイトをスワップできます。 M

Intel 8080 プラットフォームでの元の実装の結果として、オペレーティング システムに依存しないファイル アロケーション テーブル(FAT) ファイル システムは、ネイティブで別のエンディアンを使用するプラットフォームでもリトルエンディアン バイト順序で定義され、これらのプラットフォームで FAT を維持するためにバイト スワップ操作が必要になります。

ファイルシステム論理ボリュームマネージャを組み合わせたZFSは、適応型エンディアンを提供し、ビッグエンディアンとリトルエンディアンの両方のシステムで動作することが知られています。[ 37 ]

ネットワーキング

多くのIETF RFCでは、 「ネットワークオーダー」という用語が使用されています。これは、ネットワークプロトコルにおけるバイトの伝送順序を意味します。中でも、歴史的なRFC  1700は、インターネットプロトコルスイートにおけるプロトコルのネットワークオーダーをビッグエンディアンと定義しています。[ 38 ]

しかし、すべてのプロトコルがネットワーク順序としてビッグエンディアン・バイトオーダーを使用するわけではありません。サーバーメッセージブロック(SMB)プロトコルはリトルエンディアン・バイトオーダーを使用します。CANopenではマルチバイトパラメータは常に最下位バイトから先に送信されます(リトルエンディアン)。Ethernet Powerlinkでも同様です。[ 39 ]

BerkeleyソケットAPIは、16ビットおよび32ビットの整数をネットワークバイトオーダーに変換したり、ネットワークバイトオーダーから16ビットおよび32ビットの整数に変換するための一連の関数を定義している。htons(host-to-network-short)関数とhtonl(host-to-network-long)関数は、それぞれ16ビットおよび32ビットの値をマシン(ホスト)オーダーからネットワークオーダーに変換し、関数ntohsntohl関数はネットワークオーダーからホストオーダーに変換します。[ 40 ] [ 41 ]これらの関数はビッグエンディアンシステムでは 何も実行しない可能性があります。

上位ネットワークプロトコルでは通常、バイト(主にオクテット)をその基本単位とみなしますが、ネットワークスタックの最下位層では、バイト内のビットの順序付けを扱う場合があります。ビット順序付けは、リトルエンディアンまたはビッグエンディアンと呼ばれることもあります。ビット順序付けはバイト順序付けと同じである必要はありません。例えば、RS-232では最下位ビットから送信され、I2Cでは最上位ビットから送信され、SPIではどちらの順序でも送信できます。イーサネットでは、個々のビットは最下位ビットから送信されますが、バイトはビッグエンディアンで送信されます。

参照

  • ビット順序 – ビット位置を識別するための規則リダイレクト先の簡単な説明を表示するページ

参考文献

  1. ^ 「ビッグエンディアンとリトルエンディアンバイトオーダーを理解する」betterexplained.com2019年5月24日時点のオリジナルよりアーカイブ2019年5月20日閲覧
  2. ^ 「バイトオーダーPPC」2019年5月9日時点のオリジナルよりアーカイブ2019年5月20日閲覧。
  3. ^ 「C言語でエンディアン非依存のコードを書く」2019年6月10日時点のオリジナルよりアーカイブ2019年5月20日閲覧。
  4. ^インターネットにおける画像交換のためのファイル形式. 1992年4月. p. 7. doi : 10.17487/RFC1314 . RFC 1314. 2021年8月16日閲覧
  5. ^ 「インターネットの殿堂のパイオニア」インターネットの殿堂インターネット協会2021年7月21日時点のオリジナルよりアーカイブ。 2015年10月7日閲覧
  6. ^ Cary, David. 「Endian FAQ」 . 2017年11月9日時点のオリジナルよりアーカイブ。 2010年10月11日閲覧
  7. ^ James, David V. (1990年6月). 「多重化バス:エンディアン戦争は続く」. IEEE Micro . 10 (3): 9– 21. Bibcode : 1990IMicr..10c...9J . doi : 10.1109/40.56322 . ISSN 0272-1732 . S2CID 24291134 .  
  8. ^ Blanc, Bertrand; Maaraoui, Bob (2005年12月). 「エンディアン、あるいはバイト0の位置はどこか?」(PDF) . 2007年12月3日時点のオリジナルよりアーカイブ(PDF) . 2008年12月21日閲覧
  9. ^コーエン、ダニー(1980年4月1日)「聖戦と平和への嘆願についてIETF IEN 137Cohen, Danny (1981年10月). "On Holy Wars and a Plea for Peace". IEEE Computer . 14 (10): 48– 54. Bibcode : 1981Compr..14j..48C . doi : 10.1109/CM.1981.220208 .にも掲載されています。
  10. ^スウィフト、ジョナサン (1726). 「リリパットへの航海、第4章」 . 『ガリヴァー旅行記』 . 2022年9月20日時点のオリジナルよりアーカイブ。 2022年9月20日閲覧
  11. ^ブライアント、ランダル E. ; デビッド、オハラロン (2016)、「コンピュータシステム:プログラマの視点(第3版)」、ピアソンエデュケーション、p. 79、ISBN 978-1-488-67207-1
  12. ^ IBM 1401 システム概要(PDF) . IBM. 1966年4月. p. 15. A24-1401-1. 2022年10月10日時点のオリジナルよりアーカイブ(PDF) 。
  13. ^ Tanenbaum, Andrew S.; Austin, Todd M. (2012年8月4日). Structured Computer Organization . Prentice Hall PTR. ISBN 978-0-13-291652-3. 2013年5月18日閲覧
  14. ^ PDP11プロセッサハンドブック – PDP11/05/10/35/40 (PDF) . Digital Equipment Corporation. 1973年4月. 2025年7月2日時点のオリジナルよりアーカイブ(PDF) 。図2-6を参照
  15. ^byteorder(3)  –  Linuxプログラマーズマニュアル– Manned.org のライブラリ関数
  16. ^endian(3)  –  Linuxプログラマーズマニュアル– Manned.org のライブラリ関数
  17. ^ "std::byteswap" . en.cppreference.com . 2023年11月20日時点のオリジナルよりアーカイブ2023年10月3日閲覧。
  18. ^ 「Intel 64 および IA-32 アーキテクチャ ソフトウェア開発者マニュアル 第 2 巻 (2A、2B、2C): 命令セットリファレンス、AZ」(PDF)。Intel、2016 年 9 月、p. 3–112。2022年 10 月 9 日時点のオリジナルよりアーカイブ(PDF) 。2017年 2 月 5 日閲覧
  19. ^ 「i960® VHプロセッサ開発者マニュアル」(PDF)。Intel、1998年10月。2024年4月2日時点のオリジナルよりアーカイブ(PDF) 。 2024年4月2日閲覧
  20. ^ 「ARMv8-Aリファレンスマニュアル」 . ARM Holdings . 2019年1月19日時点のオリジナルよりアーカイブ2017年2月5日閲覧。
  21. ^ 「C11規格」。ISO、セクション6.5.2.3「構造体と共用体のメンバー」、§3および脚注95。2020年3月28日時点のオリジナルよりアーカイブ。 2018年8月15日閲覧
  22. ^ 「3.10 最適化を制御するオプション: -fstrict-aliasing」 . GNU コンパイラコレクション (GCC) . フリーソフトウェア財団. 2023年7月1日時点のオリジナルよりアーカイブ。 2018年8月15日閲覧
  23. ^ Torvalds, Linus (2018年6月5日). 「[GIT PULL] デバイスプロパティフレームワークのv4.18-rc1アップデート」 . Linuxカーネル(メーリングリスト). 2018年8月15日時点のオリジナルよりアーカイブ。 2018年8月15日閲覧
  24. ^ House, David; Faggin, Federico; Feeney, Hal; Gelbach, Ed; Hoff, Ted; Mazor, Stan; Smith, Hank (2006年9月21日). 「Intel 8008マイクロプロセッサの開発と普及に関するオーラル・ヒストリー・パネル」(PDF) .コンピュータ歴史博物館. p. b5. 2014年6月29日時点のオリジナルよりアーカイブ( PDF) . 2014年4月23日閲覧
  25. ^ケン、ルンデ (2009 年 1 月 13 日)。CJKV 情報処理。オライリー・メディア社、p. 29.ISBN 978-0-596-51447-1. 2013年5月21日閲覧
  26. ^ 「Cx51 ユーザーズガイド: E. バイトオーダー」keil.com . 2015年4月2日時点のオリジナルよりアーカイブ2015年3月28日閲覧
  27. ^ Jeff Scheel (2016年6月16日). 「Little endian and Linux on IBM Power Systems」 . IBM . 2022年3月27日時点のオリジナルよりアーカイブ。 2022年3月27日閲覧
  28. ^ Timothy Prickett Morgan (2019年6月10日). 「Power SystemsでRHEL 8への移行が始まる」 . ITJungle . 2022年1月24日時点のオリジナルよりアーカイブ2022年3月26日閲覧。
  29. ^ 「BE-32バスとBE-8バスの違い」2019年2月12日時点のオリジナルよりアーカイブ2019年2月10日閲覧。
  30. ^ 「第4世代Intel® Core™プロセッサー・ファミリーにおける新しい命令のサポートを検出する方法」(PDF)2016年3月20日時点のオリジナルよりアーカイブ(PDF) 。 2017年5月2日閲覧
  31. ^ Savard, John JG (2018) [2005]、「浮動小数点形式」quadibloc2018年7月3日時点のオリジナルからアーカイブ、 2018年7月16日取得
  32. ^ "pack – リストをバイナリ表現に変換する" . 2009年2月18日時点のオリジナルよりアーカイブ2009年2月4日閲覧。
  33. ^ PDP-11/45プロセッサハンドブック(PDF) . Digital Equipment Corporation . 1973. p. 165. 2022年10月9日時点のオリジナルよりアーカイブ(PDF) 。
  34. ^ Jalics, Paul J.; Heines, Thomas S. (1983年12月1日). 「ポータブルオペレーティングシステムの転送:UNIXからIBMミニコンピュータへ」 Communications of the ACM . 26 (12): 1066– 1072. doi : 10.1145/358476.358504 . S2CID 15558835 . 
  35. ^ AMD64アーキテクチャプログラマーズマニュアル第2巻:システムプログラミング(PDF)(技術レポート)。2013年。p.80。 2018年2月18日時点のオリジナル(PDF)からのアーカイブ。
  36. ^ 「Microsoft Office Excel 97 - 2007 バイナリファイル形式の仕様 (*.xls 97-2007 形式)」。Microsoft Corporation。2007年。2008年12月22日時点のオリジナルよりアーカイブ。 2014年8月18日閲覧
  37. ^ Matt Ahrens (2016). FreeBSDカーネル内部:徹底的なコードウォークスルー. OpenZFSドキュメント/Read Writeレクチャー . 2016年4月14日時点のオリジナルよりアーカイブ。 2016年3月30日閲覧
  38. ^ Reynolds, J. ; Postel, J. (1994年10月). 「データ表記法」 .割り当て番号. IETF . p. 3. doi : 10.17487/RFC1700 . STD 2. RFC 1700. 2012年3月2日閲覧.
  39. ^ Ethernet POWERLINK標準化グループ(2012)、 EPSGワーキングドラフト提案301:Ethernet POWERLINK通信プロファイル仕様バージョン1.1.4、第6.1.1章。
  40. ^ IEEEおよびThe Open Group (2018). 「3. システムインターフェース」. The Open Group Base Specifications Issue 7. Vol. 2. p. 1120. 2021年4月18日時点のオリジナルよりアーカイブ。 2021年4月9日閲覧
  41. ^ "htonl(3) - Linux man page" . linux.die.net . 2021年4月18日時点のオリジナルよりアーカイブ2021年4月9日閲覧。