エンディアンネス

フリー百科事典ウィキペディアより
ナビゲーションにジャンプ 検索にジャンプ

コンピューティングでは、エンディアンとは、コンピューター メモリ内のデジタル データワードのバイトの順序またはシーケンスですエンディアンは、主にビッグ エンディアン( BE ) またはリトル エンディアン( LE ) として表現されます。ビッグ エンディアン システムでは、ワードの最上位バイトが最小のメモリ アドレスに格納され、最下位バイトが最大のメモリ アドレスに格納されます。対照的に、リトル エンディアン システムでは、最下位バイトが最小アドレスに格納されます。[1] [2] [3]バイエンディアン は、データのフェッチとストア、または命令フェッチで切り替え可能なエンディアンを特徴とする多数のコンピューター アーキテクチャでサポートされている機能です。他の順序付けは、一般的にミドルエンディアンまたは混合エンディアンと呼ばれます。[4] [5] [6] [7]

エンディアンは、ビットが通信チャネルを介して送信される順序を記述するためにも使用できます[要出典]。たとえば、通信チャネルのビッグエンディアンは最上位ビットを最初に送信します。[8] [要出典]ビットエンディアンは、他のコンテキストではめったに使用されません。

語源

形容詞のエンディアンは、ジョナサン スウィフトによる1726 年の小説ガリバー旅行記に由来します。リリプティアンとして知られている文字は、ゆで卵の殻を大きな端から割ったもの(ビッグ エンディアン) または小さな端から割ったもの (リトルエンディアン)に分けられます。

Danny Cohenは、1980 年に発行されたInternet Experiment Noteで、ビッグ エンディアンリトルエンディアンという用語をコンピューター サイエンスに導入し、データの順序付けを行いました。 [9]

形容詞のエンディアンは、18 世紀のアングロ アイリッシュの作家ジョナサン スウィフトの著作に由来します。1726 年の小説ガリバー旅行記で、彼は、ゆで卵の殻を大きな端から割ったり、小さな端から割ったりするリリプティアンの宗派間の対立を描いています。彼はそれらをビッグエンディアンリトルエンディアンと呼びました。[10] [11]コーエンは、1980 年のノートの付録で、 ガリバー旅行記との関係を明確にしています。

概要

コンピュータは、さまざまなサイズのバイナリ ビットのグループに情報を格納します。各グループには、アドレスと呼ばれる番号が割り当てられます。この番号は、コンピュータがそのデータにアクセスするために使用します。最近のほとんどのコンピューターでは、アドレスを持つ最小のデータ グループは 8 ビット長であり、バイトと呼ばれます。大きなグループは 2 バイト以上で構成されます。たとえば、32 ビットワードには 4 バイトが含まれます。コンピューターが大きなグループ内の個々のバイトに番号を付ける方法として、両端から開始する方法が 2 つあります。どちらのタイプのエンディアンも、デジタル電子工学で広く使用されています。新しい設計のエンディアンの最初の選択は多くの場合任意ですが、その後のテクノロジの改訂や更新では、下位互換性を維持するために既存のエンディアンが永続化されます。

内部的には、ハードウェアは一貫して同じエンディアンを使用してデータの保存と読み込みを行うため、使用するエンディアンに関係なく、特定のコンピューターは同じように機能します。このため、プログラマーやコンピューター ユーザーは通常、使用しているコンピューターのエンディアンを無視します。ただし、異なるコンピューター間でデータを転送する場合や、プログラマーがメモリ ダンプからコンピューター内部のデータ バイトを調査する場合など、コンピューターの外部にデータを移動する場合、エンディアンが問題になる可能性があり、使用されるエンディアンは予想とは異なります。このような場合、データのエンディアンを理解し、考慮する必要があります。

エンディアンの例
ビッグエンディアン
リトルエンディアン

これらの 2 つの図は、異なるエンディアンを使用する 2 台のコンピューターが0x 0A0B0C0Dの値を持つ 32 ビット (4 バイト) 整数を格納する方法を示していますどちらの場合も、整数は0x0A0x0B0x0C、および0x0Dの4 バイトに分割され、バイトはメモリ内の 4 つの連続したバイト位置に格納されます。アドレスaのメモリ位置から始まり、a + 1a + 2、および+ 3ビッグ エンディアンとリトル エンディアンの違いは、格納される整数の 4 バイトの順序です。

左側の図は、ビッグエンディアンを使用するコンピューターを示しています。これにより、アドレス a の最上位バイト 0x0A で整数格納開始され、アドレスa + 3 の最下位バイト0x0Dで終了します

右側の図は、リトルエンディアンを使用するコンピューターを示しています。これは、アドレス a の最下位バイト 0x0D で整数格納開始し、アドレスa + 3の上位バイト0x0Aで終了します

各コンピューターは同じエンディアンを使用して整数を格納および取得するため、結果は両方のコンピューターで同じになります。メモリが整数ではなくバイト単位でアドレス指定される場合、またはエンディアンが異なるコンピュータ間でメモリの内容が転送される場合に、問題が発生することがあります。

ビッグエンディアンは、インターネット プロトコル スイートなどのネットワーク プロトコルで支配的な順序であり、ネットワーク順序と呼ばれ、最上位バイトが最初に送信されます。逆に、プロセッサ アーキテクチャ ( x86、ほとんどのARM実装、ベースRISC-V実装) とそれに関連するメモリでは、リトル エンディアンが支配的な順序付けになっています。ファイル形式はどちらの順序でも使用できます。一部の形式では、両方を組み合わせて使用​​したり、ファイル全体でどの順序が使用されているかを示すインジケーターが含まれています。[12]

リトルエンディアンとビッグエンディアンのスタイルは、より一般的には、数値システムの数字や日付のセクションなど、あらゆる表現の順序を特徴付けるために使用することもできます位置表記の数値は、通常、右から左のスクリプトであっても、左から右のビッグエンディアンの順序で数字を使用して記述されます。同様に、プログラミング言語では、数値リテラルにビッグ エンディアンの桁順が使用されます。

基本

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

コンピュータ プログラムでは、1 バイトに格納できるよりも多くのデータで構成されるデータ構造またはフィールドを使用することがよくあります。この記事の文脈では、型を任意に複雑にすることはできません。「フィールド」は、連続するバイト シーケンスで構成され、単一のハードウェア命令で少なくとも潜在的に操作できる「単純なデータ値」表しますほとんどのシステムでは、マルチバイトの単純なデータ値のアドレスは、その最初のバイト (アドレスが最も小さいバイト) のアドレスです。【注1】

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

数字

位置番号システム(ほとんどの場合は基数 2、または基数 10 [注 2]はほとんどありません) は、コンピューターによる整数データの表現、特に操作の主要な方法です。純粋な形式では、これは C データ型などの中程度のサイズの負でない整数に対して有効ですunsignedこのような数体系では、整数に寄与する数字のは、1 桁としての値だけでなく、完全な数字の中での位置 (意味と呼ばれる) によっても決定されます。これらの位置は、主に次の 2 つの方法でメモリにマップできます。[13]

  • ビッグエンディアン呼ばれる、メモリ アドレスの増加 (または時間の増加) に伴って数値の重要性が低下します。
  • リトルエンディアンと呼ばれる、メモリ アドレスの増加 (または時間の増加) に伴う数値の重要度の増加[注3]

コンピュータ ハードウェアによって直接サポートされる整数データは、2 の累乗の固定幅を持ちます。たとえば、8 ビット ≙ 1 バイト、16 ビット ≙ 2 バイト、32 ビット ≙ 4 バイト、64 ビット ≙ 8 バイト、128 ビット ≙ などです。 16 バイト。このようなフィールドのバイトへの低レベル アクセス シーケンスは、実行する操作によって異なります。足し算引き算掛け算では最下位バイトが最初にアクセスされます除算比較のために最上位バイトが最初にアクセスされます§ 計算順序を参照してください

浮動小数点数については、§ 浮動小数点を参照しください

テキスト

文字 (テキスト) 文字列を相互に比較する場合、たとえば、並べ替えなどのメカニズムをサポートするために、単一の位置要素 (文字) にも位置値がある辞書式に非常に頻繁に行われます。辞書式の比較は、ほぼすべての場所を意味します。電話帳のように、最初の文字が最も高くランク付けされます。【注4】

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

ハードウェア

多くの歴史的および現存するプロセッサは、排他的または設計オプションとして、ビッグ エンディアン メモリ表現を使用します。他のプロセッサ タイプでは、リトル エンディアンのメモリ表現が使用されます。middle-endianmixed-endian、またはPDP-11 -endianと呼ばれるさらに別の方式を使用するものもあります。

一部の命令セットは、データのフェッチとストア、命令フェッチ、またはその両方で切り替え可能なエンディアンを可能にする設定を特徴としています。この機能により、ネットワーク デバイスやソフトウェアのパフォーマンスが向上したり、ロジックが簡素化されたりする可能性があります。bi-endianという言葉は、ハードウェアについて言及された場合、いずれかのエンディアン形式でデータを計算または渡すマシンの機能を示します。

異なるエンディアンのデータを処理することは、NUXI 問題と呼ばれることがあります。[14]この用語は、ミックス エンディアンの PDP-11 [注 5]上で動作するUNIXをビッグ エンディアンの IBM Series/1 コンピュータに適合させる際 に遭遇するバイト オーダーの競合を暗示しています。Unix は、異なる内部表現を持つプラットフォーム用に同じコードをコンパイルできる最初のシステムの 1 つです。変換された最初のプログラムの 1 つは を出力するはずでしたが、Series/1では代わりに出力されました。[15]UnixnUxi

IBM System/360は、その後継のSystem/370ESA/390、およびz/Architectureと同様に、ビッグ エンディアンのバイト順を使用しますPDP-10は、バイト指向の命令にビッグ エンディアン アドレッシングを使用します。IBM シリーズ/1ミニコンピューターは、ビッグ エンディアンのバイト順を使用します

Datapoint 2200は、単純なビット シリアル ロジックとリトル エンディアンを使用して、キャリーの伝播を容易にしました。Intel が Datapoint 用の8008マイクロプロセッサを開発したとき、互換性のためにリトル エンディアンを使用しました。しかし、Intel は 8008 を間に合わせることができなかったため、Datapoint は中規模の統合に相当するものを使用しましたが、 MCS-488086およびその後継のx86を含むほとんどの Intel 設計でリトル エンディアンが維持されました。[16] [17] DEC AlphaAtmel AVRVAXMOS Technology 6502ファミリー(Western Design Center 65802および65C816 )、Zilog Z80 ( Z180およびeZ80を含む)、Altera Nios II、およびその他の多くのプロセッサおよびプロセッサ ファミリもリトルエンディアンです。

Motorola 6800 / 6801、6809、および68000シリーズのプロセッサは、ビッグ エンディアン形式を使用していました。

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

SPARCは歴史的に、バイエンディアンであるバージョン 9 までビッグエンディアンを使用していました。

同様に、初期の IBM POWER プロセッサはビッグ エンディアンでしたが、PowerPCPower ISAの子孫は現在バイ エンディアンです。

ARM アーキテクチャは、バイ エンディアンになったバージョン 3 より前はリトル エンディアンでした。

新しいアーキテクチャ

IA-32およびx86-64命令セット アーキテクチャでは、リトル エンディアン形式が使用されます。この規則に従い、リトル エンディアン モードのみを許可するその他の命令セット アーキテクチャには、Nios IIAndes Technology NDS32、およびQualcomm Hexagonが含まれます。

IBM z/ArchitectureおよびOpenRISCは、ビッグ エンディアン アーキテクチャのみを含みます

一部の命令セット アーキテクチャは「バイ エンディアン」であり、どちらのエンディアンでもソフトウェアを実行できます。これらには、Power ISASPARC、ARM AArch64C-Sky、およびRISC-Vが含まれます。IBM AIXおよびIBM iは、バイエンディアンの Power ISA でビッグエンディアン モードで実行されます。Linuxはもともとビッグ エンディアン モードで実行されていましたが、2019 年までに IBM は Linux をリトルエンディアン モードに移行し、x86 から Power への Linux ソフトウェアの移植を容易にしました。[19] [20] SPARC には関連するリトルエンディアン展開がありません。および Linux はバイエンディアン SPARC システム上でビッグエンディアン モードで実行され、実際にはビッグエンディアンと見なすことができます。ARM、C-Sky、および RISC-V には関連するビッグ エンディアン展開がなく、実際にはリトル エンディアンと見なすことができます。

バイエンディアン

一部のアーキテクチャ ( ARMバージョン 3 以降、PowerPCAlphaSPARC V9、MIPSIntel i860PA-RISCSuperH SH-4およびIA-64 を含む) は、データのフェッチとストア、命令で切り替え可能なエンディアンを可能にする設定を備えています。フェッチ、またはその両方。この機能により、ネットワーク デバイスやソフトウェアのパフォーマンスが向上したり、ロジックが簡素化されたりする可能性があります。bi-endianという言葉は、ハードウェアについて言及された場合、いずれかのエンディアン形式でデータを計算または渡すマシンの機能を示します。

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

バイエンディアンという用語は、主にプロセッサがデータアクセスを処理する方法を指すことに注意してください。インテルのIA-64ベースの Itanium CPUのように、データ アクセスが完全にバイ エンディアンであっても、特定のプロセッサでの命令アクセス (命令語のフェッチ) は固定エンディアンを想定している場合があります。両方を許可します。

また、名目上バイエンディアンの CPU の中には、エンディアンを完全に切り替えるためにマザーボードのサポートが必要なものがあることにも注意してください。たとえば、リトル エンディアン モードの 32 ビット デスクトップ指向PowerPCプロセッサは、実行中のプログラムの観点からはリトル エンディアンとして動作しますが、マザーボードが 8 バイト レーンすべてで 64 ビット スワップを実行する必要があります。物事のリトルエンディアン ビューがI/Oデバイスに適用されることを確認します。この異常なマザーボード ハードウェアがない場合、デバイス ドライバ ソフトウェアは、不完全な変換を元に戻すために別のアドレスに書き込む必要があり、通常のバイト スワップも実行する必要があります。

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

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

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

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

最近の Intel x86 および x86-64 アーキテクチャの CPU には MOVBE 命令 (第 4 世代以降のIntel Core 、 Atomの後) [22]があり、メモリからビッグ エンディアン形式の単語をフェッチするか、ビッグ エンディアン形式でメモリに単語を書き込みます。これらのプロセッサは、それ以外は完全にリトルエンディアンです。

場所によって異なるフォーマットを使用するデバイスもあります。たとえば、BQ27421テキサス インスツルメンツのバッテリ ゲージは、レジスタにリトル エンディアン形式を使用し、ランダム アクセス メモリにビッグ エンディアン形式を使用します。この動作は変更できないようです。

浮動小数点

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

可変長データ

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

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

ほとんどのシステムでは、マルチバイト値のアドレスは最初のバイト (アドレスが最も小さいバイト) のアドレスです。そのタイプのリトル エンディアン システムには、十分に低いデータ値の場合、異なるアドレスを使用せずに同じ値を異なる長さでメモリから読み取ることができるという特性があります (アラインメントの制限が課されている場合でも)。たとえば、コンテンツを含む 32 ビットのメモリ ロケーションは、 8 ビット(値 = 4A)、16 ビット(004A)、24 ビット(00004A)、または32 ビット4A 00 00 00と同じアドレスで読み取ることができます。(0000004A)、すべて同じ数値を保持します。このリトル エンディアン プロパティが高レベル プログラマーによって直接使用されることはめったにありませんが、コード オプティマイザーやアセンブリ言語プログラマーによって使用されることがあります。要例

より具体的に言えば、このような ID は、ほとんどのリトル エンディアン システムで trueを返す次のC コードと同等です。

組合 {
  uint8_t u8 ; uint16_t u16 ; uint32_t u32 ; uint64_t u64 ;       
} u = { . u64 = 0x4A };       
puts ( u . u8 == u . u16 && u . u8 == u . u32 && u . u8 == u . u64 ? "真" : "偽" );              

C++ では許可されていませんが、そのような型パニングコードは、C11 標準[25]によって「実装定義」として許可されており、ハードウェアとやり取りするコードで一般的に使用されています[26] 。[27]

一方、状況によっては、完全な表現ではなく最上位部分のみを読み取ることによって、マルチバイトまたはマルチワード値の近似値を取得することが役立つ場合があります。ビッグ エンディアン プロセッサは、完全な値に使用されるのと同じベース アドレスを使用して、このような近似値を読み取ることができます。

もちろん、この種の単純化は、異なるエンディアンのシステム間で移植可能ではありません。

計算順序

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

加算、減算、および乗算は、最下位桁の位置から開始し、キャリーを後続の上位の位置に伝搬します。ほとんどのシステムでは、マルチバイト値のアドレスは、その最初のバイト (アドレスが最も小さいバイト) のアドレスです。これらの操作の実装は、この最初のバイトに最下位桁が含まれるリトル エンディアン マシンを使用すると、わずかに簡単になります。

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

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

割り当てステートメント による通常のデータ転送は、原則としてプロセッサのエンディアンとは無関係です。

ミドルエンディアン

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

PDP-11は原則として 16 ビットのリトル エンディアン システムですPDP-11/45、PDP-11/70、およびそれ以降の一部のプロセッサのオプションの浮動小数点プロセッサで浮動小数点値と整数値を変換する命令は、32 ビットの「倍精度整数 long」値を予想されるリトル エンディアンの順序からスワップされた 16 ビットの半分。UNIX Cコンパイラは、32 ビット長整数に対して同じ形式を使用していました。この順序付けはPDP-endianとして知られています。[28]

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

PDP-11 での 32 ビット整数0x0A0B0C0Dの格納
住所の増加  →
... 0Bh _ 0Ah _ 0Dh _ 0Ch _ ...
... 0A0Bh _ 0C0D h ...

ここでの 16 ビット値は、実際のレイアウトではなく、数値を指します。

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

エンディアンの日付

日付は、年、月、日の順序によって異なるエンディアンで表すことができます。たとえば、2002 年 9 月 12 日は次のように表すことができます。

  • リトルエンディアンの日付 (日、月、年)、12-09-2002
  • ミドル エンディアンの日付 (月、日、年)、09-12-2002
  • ビッグエンディアンの日付 (年、月、日)、ISO 8601と同様に2002-09-12

米国での日付と時刻の表記では、日付はミドル エンディアンであり、世界中の日付形式とは異なります

バイトアドレス指定

メモリ バイトが左から右に順次出力される場合 (たとえば、16 進ダンプ)、整数のリトル エンディアン表現は、左から右に増加する重要性を持ちます。つまり、視覚化すると逆に表示され、直感に反する可能性があります。

この動作は、たとえば、メモリ内の特定の文字のシーケンスになるように、文字を整数にパックすることを含むFourCCまたは同様の手法で発生します。'John'文字を 16 進ASCIIで書き、先頭に追加した結果として表記法を定義し0x、短いシーケンス ( Unix/MacOS スタイル のC の複数文字リテラル) についても同様に定義します。

   「ジョン」
六角 4A 6F 68 6E
----------------
   -> 0x4A6F686E

ビッグ エンディアンのマシンでは、値は左から右に表示され、結果を読み取るための正しい文字列順序と一致します。

住所の増加  →
... 4Ah _ 6 68時間 6E ...
... 「じ」 「お」 'h' 「ん」 ...

しかし、リトルエンディアンのマシンでは、次のように表示されます。

住所の増加  →
... 6E 68時間 6 4Ah _ ...
... 「ん」 'h' 「お」 「じ」 ...

ミドル エンディアンのマシンはこれをさらに複雑にします。たとえば、PDP-11では、32 ビット値は 2 つの 16 ビット ワード'Jo' 'hn'としてビッグ エンディアンで格納され、16 ビット ワードの文字はリトル エンディアンで格納されます。

住所の増加  →
... 6 4Ah _ 6E 68時間 ...
... 「お」 「じ」 「ん」 'h' ...

バイトスワッピング

バイトスワッピングは、バイトを再配置してエンディアンを変更することで構成されます。多くのコンパイラは、ネイティブ プロセッサ命令 ( / ) にコンパイルされる可能性が高い組み込みを提供します。スワッピング用のソフトウェア インターフェイスには、次のものがあります。 bswapmovbe__builtin_bswap32

  • 標準ネットワーク エンディアン機能 (BE との間、最大 32 ビット)。[30] Windows には 64 ビット拡張機能がありwinsock2.hます。
  • BSD および Glibcendian.h関数 (BE および LE との間、最大 64 ビット)。[31]
  • macOS OSByteOrder.hマクロ (BE および LE との間、最大 64 ビット)。

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

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

一部のCPU命令セットは、 bswap[32] ( x86 - 486以降) やrev[33] ( ARMv6以降)など、エンディアン バイト スワッピングのネイティブ サポートを提供します

一部のコンパイラには、バイト スワップ機能が組み込まれています。たとえば、インテル FortranCONVERTコンパイラは、ファイルを開くときに非標準の指定子をサポートしていますOPEN(unit, CONVERT='BIG_ENDIAN',...)

一部のコンパイラには、すべてのファイル IO 操作の変換をグローバルに有効にするコードを生成するためのオプションがあります。これにより、コードを変更せずに、反対のエンディアンを持つシステムでコードを再利用できます。

通常、Fortran はレコード(単一の Fortran ステートメントによって書き込まれるデータとして定義される) を、等しい整数であるカウント フィールドが前後に続くデータとして実装するため、一方のエンディアンで作成された Fortran のフォーマットされていないシーケンシャル ファイルは、通常、他方のエンディアンを使用するシステムでは読み取ることができません。データのバイト数に。エンディアンが異なるシステムで Fortran を使用してこのようなファイルを読み込もうとすると、カウント フィールドが正しくないため、実行時エラーが発生します。この問題は、フォーマットされていないシーケンシャル ファイルではなく、シーケンシャル バイナリ ファイルを書き出すことで回避できます。ただし、別の言語 ( CPythonなど) でプログラムを作成するのは比較的簡単であることに注意してください。) は、Fortran レコードとデータを読み取るときに「外部」エンディアンから変換することにより、「外部」エンディアンの Fortran シーケンシャル未フォーマット ファイルを解析し、「ネイティブ」エンディアンに変換します。

オプションで、 Unicodeテキストをバイト オーダー マーク(BOM) で開始して、ファイルまたはストリームのエンディアンを示すことができます。そのコード ポイントは U+FEFF です。たとえば、UTF-32では、ビッグエンディアン ファイルは00 00 FE FF;で始まる必要があります。リトルエンディアンは で始まる必要がありFF FE 00 00ます。

MATLAB .matファイルやトポグラフィで使用される.bilデータ形式などのアプリケーション バイナリ データ形式は、通常、エンディアンに依存しません。これは、データを常に 1 つの固定エンディアンで格納するか、エンディアンを示すスイッチをデータと共に保持することによって実現されます。

最初のケースの例は、バイナリXLS ファイル形式で、Windows と Mac システムの間で移植可能であり、常にリトル エンディアンであり、ビッグ エンディアンの Motorola 68K または PowerPC プロセッサで実行する場合、Mac アプリケーションはロード時にバイトを交換して保存します。 . [34]

TIFF画像ファイルは 2 番目の戦略の例であり、そのヘッダーは、内部の 2 進整数のエンディアンについてアプリケーションに指示します。ファイルが署名MMで始まる場合、整数がビッグ エンディアンで表されていることを意味し、リトルエンディアンを意味しIIます。これらの署名には、それぞれ 16 ビット ワードが 1 つ必要であり、回文(つまり、同じ順方向と逆方向を読み取る) であるため、エンディアンに依存しません。IntelMotorolaIの略で、 IBM PC互換機 (Intel) とApple MacintoshのそれぞれのCPUプロバイダです。M1980 年代のプラットフォーム (Motorola)。Intel CPU はリトル エンディアンですが、Motorola 680x0 CPU はビッグ エンディアンです。この明示的な署名により、TIFF リーダー プログラムは、エンディアンが異なるコンピューター上で実行されている TIFF ライター プログラムによって特定のファイルが生成された場合に、必要に応じてバイトを交換できます。

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

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

ロジック設計

デジタル ロジックの表現に使用されるハードウェア記述言語(HDL) は、多くの場合、任意の粒度で任意のエンディアンをサポートします。

たとえば、SystemVerilogでは、ワードをリトル エンディアンまたはビッグ エンディアンとして定義できます。

論理 [ 31 : 0 ]  little_endian ;   // ビット 0は最下位
ビットロジック [ 0:31 ] big_endian ;  // ビット 31 は最下位ビットです。 logic [ 0 : 3 ][ 7 : 0 ] mixed ; // 各バイトはリトル エンディアンですが、バイトはビッグ エンディアン順にパックされます。  
    

ネットワーキング

多くのIETF RFCでは、ネットワーク オーダーという用語が使用されています。これは、ネットワーク プロトコルのネットワーク上でのビットとバイトの送信順序を意味します特に、歴史的な RFC 1700 (インターネット標準STD 2とも呼ばれます) は、インターネット プロトコル スイートのプロトコルのネットワーク順序をビッグ エンディアンに定義しているため、ビッグ エンディアン バイトに対して「ネットワーク バイト オーダー」という用語を使用しています。注文。[36]

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

Berkeley ソケット APIは、16 ビットおよび 32 ビットの整数をネットワーク バイト オーダーとの間で変換する一連の関数を定義します。( htonshost-to-network-short) およびhtonl(host-to-network-long) 関数は、マシン (ホスト) からネットワークの順序まで、それぞれビット値と 32 ビット値。ntohsおよび関数ntohl、ネットワークからホストの順序に変換します。[38] [39]これらの関数は、ビッグエンディアン システムで はノーオペレーションである可能性があります。

高レベルのネットワーク プロトコルは通常、バイト (ほとんどの場合octetを意味する) を原子単位と見なしますが、最下位のネットワーク プロトコルは、バイト内のビットの順序付けを処理する場合があります。

ビット エンディアン[要出典]

ビット番号付けは、エンディアンに似た概念ですが、バイトではなくビットのレベルです。ビット エンディアンまたはビット レベル エンディアンとは、シリアル メディア上のビットの伝送順序を指します。RS-232HDLCEthernet、およびUSBでは、リトルエンディアン (最下位ビットが最初に来る) のビットレベルのアナログが使用されます一部のプロトコルは逆の順序を使用します (例: TeletextI 2 CSMBusPMBusSONET および SDH [40] )、およびARINC 429は、そのラベル フィールドに 1 つの順序を使用し、フレームの残りの部分に別の順序を使用します。通常、バイト内の順序に関係なく、ビットには一貫したビューが存在するため、後者は非常に低いレベルでのみ関連するようになります。1 つの例外は、既知の長さまでのすべてのバースト エラーを検出する巡回冗長検査の機能によって発生します。これは、ビットの順序がシリアル伝送のバイトの順序と異なる場合に台無しになります。

シリアル化を除けば、ビット エンディアンビット レベル エンディアンという用語はめったに使用されません。個々のビットが一意のアドレスを持つコンピューター アーキテクチャはまれだからです。個々のビットまたはビット フィールドは、数値または高級プログラミング言語で割り当てられた名前を介してアクセスされますが、その影響はマシンに依存するか、ソフトウェアの移植性に欠ける場合があります。

注意事項

  1. ^ この規則の例外は、例えばIBM 1401の Add 命令で、可変長フィールドを下位 (最上位アドレス) の位置でアドレス指定し、その長さは上位 (最下位) に設定されたワード マークによって定義されます。宛)位置。加算などの演算が実行されると、プロセッサは 2 つのフィールドの上位アドレスの下位位置から開始し、上位に向かって処理を進めます。
  2. ^ BCDでエンコードされている場合、基数 10 はエンディアンに関連する可能性があります。
  3. ^ これらの表現では、「端」という用語は、大きな応答が存在する端を意味することに注意してください。最初にほとんど意味が書かれてつまり、フィールドの開始位置です。
  4. ^ 1 つの命令のみを使用してこれを行うことができるほとんどすべてのマシン( § 可変長データを参照) は、いずれにせよ、タイプがビッグエンディアンか、少なくとも混合エンディアンです。
  5. ^ PDP-11 アーキテクチャは、ネイティブの 16 ビット ワード内ではリトル エンディアンですが、32 ビット データは通常とは異なるビッグエンディアンのワード ペアとして格納されます。

参考文献

  1. ^ ビッグ エンディアンとリトル エンディアンのバイト順を理解する
  2. ^ バイトオーダー PPC
  3. ^ エンディアンに依存しないコードを C で書く
  4. ^ "インターネット殿堂パイオニア" . インターネットの殿堂インターネット社会
  5. ^ キャリー、デビッド. 「エンディアン FAQ」. 2010 年10 月 11 日閲覧
  6. ^ James、David V. (1990 年 6 月)。「多重バス: エンディアン戦争は続く」. IEEE マイクロ10 (3): 9–21. ドイ: 10.1109/40.56322ISSN 0272-1732S2CID 24291134 .  
  7. ^ ブラン、ベルトラン。マーラウイ、ボブ (2005 年 12 月)。「エンディアンまたはバイト 0 はどこですか?」(PDF) . 2008 年12 月 21 日閲覧 {{cite journal}}: Cite journal requires |journal= (help)
  8. ^ RFC1700 . ドイ: 10.17487/RFC1700 .
  9. ^ コーエン、ダニー(1980-04-01). 聖戦と平和への嘆願についてIETFIEN 137. ...どちらのビットが最初に移動する必要がありますか? 単語の小さい方の端からのビット、または単語の大きい方の端からのビット? 前者のアプローチに従うものはリトル エンディアンと呼ばれ、後者のアプローチに従うものはビッグ エンディアンと呼ばれます。1981 年 10 月号のIEEE Computerも掲載されています。
  10. ^ スウィフト、ジョナサン (1726). ガリバー旅行記
  11. ^ ブライアント、ランダル E .; David、O'Hallaron (2016)、Computer Systems: A Programmer's Perspective (3 ed.)、Pearson Education、p. 79、ISBN 978-1-488-67207-1
  12. ^ インターネットで画像を交換するためのファイル形式1992 年 4 月。7.ドイ: 10.17487/RFC1314 . RFC1314 _ 2021年8月16日閲覧TIFF ファイルは、ファイルで使用されるバイト順 (ビッグまたはリトル エンディアン) を指定するファイル ヘッダーで始まります。
  13. ^ タネンバウム、アンドリュー S.; オースティン、トッド M. (2012 年 8 月 4 日)。構造化されたコンピューター組織プレンティス・ホール PTR. ISBN 978-0-13-291652-3. 2013年 5 月 18 日閲覧
  14. ^ 「NUXI 問題」 . 専門用語ファイル. 2008 年12 月 20 日閲覧
  15. ^ Jalics、ポール J.; Heines、Thomas S. (1983 年 12 月 1 日)。「ポータブル オペレーティング システムの移植: UNIX から IBM ミニコンピューターへ」. ACM の通信26 (12): 1066–1072。ドイ: 10.1145/358476.358504 . S2CID 15558835 . 
  16. ^ ハウス、デビッド; ファギン、フェデリコ。フィーニー、ハル。ゲルバッハ、エド。ホフ、テッド。メイザー、スタン。スミス、ハンク (2006-09-21)。「Intel 8008 マイクロプロセッサの開発と普及に関するオーラル ヒストリー パネル」(PDF) . コンピュータ歴史博物館p。b5 . 2014年 4 月 23 日閲覧 Mazor: そして最後に、Datapoint の元の設計は...彼らが望んでいたのは [ビット] シリアル マシンでした。シリアル マシンについて考える場合、すべてのアドレスとデータを一度に 1 ビットずつ処理する必要があります。これを行う合理的な方法は、下位ビットから上位ビットへということです。つまり、ジャンプ命令自体では、シリアル マシンに 14 ビット アドレスを配置する方法は、ビット バックワードであるということです。さて、私たちはビットシリアルではなく、バイトパラレルマシンを構築するつもりでした。妥協点として(顧客の精神と彼のためだけに)、バイトを逆に入れました。[最初に] 下位バイトを配置し、次に上位バイトを配置します。それ以来、これは「リトル エンディアン」形式と呼ばれるようになりましたが、これはあなたが自然だと思うものとは正反対のものです。良い、私たちは Datapoint のためにそれを行いました。ご覧のとおり、彼らは [8008] チップを使用したことがないので、ある意味では「間違い」でしたが、その [リトル エンディアン形式] は 8080 と 8086 に引き継がれ、マークの 1 つです。この家族の。
  17. ^ ルンデ、ケン (2009 年 1 月 13 日). CJKV 情報処理O'Reilly Media, Inc. p. 29.ISBN _ 978-0-596-51447-1. 2013年 5 月 21 日閲覧
  18. ^ 「Cx51 ユーザーズ ガイド: E. バイト順」 . keil.com
  19. ^ ジェフ・シール (2016-06-16). 「IBM Power Systems 上のリトルエンディアンと Linux」 . IBM 2022 年3 月 27 日閲覧
  20. ^ ティモシー・プリケット・モーガン (2019 年 6 月 10 日). 「Power Systems で RHEL 8 への移行が始まる」 . ITジャングルITジャングル2022年3月26日閲覧
  21. ^ 「BE-32 バスと BE-8 バスの違い」 .
  22. ^ 「第 4 世代インテル® Core™ プロセッサー・ファミリーで新しい命令のサポートを検出する方法」(PDF) . 2017年5 月 2 日閲覧
  23. ^ Savard, John JG (2018) [2005], "Floating-Point Formats" , quadibloc , 2018-07-03にオリジナルからアーカイブ、 2018-07-16に検索
  24. ^ "pack – リストをバイナリ表現に変換する" .
  25. ^ 「C11規格」 . ISO。セクション 6.5.2.3「構造体と共用体のメンバー」、§3 および脚注 95 2018年8月15日閲覧95) 共用体オブジェクトの内容を読み取るために使用されるメンバーが、オブジェクトに値を格納するために最後に使用されたメンバーと同じでない場合、値のオブジェクト表現の適切な部分は、新しいオブジェクト表現として再解釈されます。 6.2.6 で説明されているタイプ (「タイプパニング」と呼ばれることもあるプロセス)。
  26. ^ "3.10 最適化を制御するオプション: -fstrict-aliasing" . GNU コンパイラ コレクション (GCC)フリーソフトウェア財団2018年8月15日閲覧
  27. ^ Torvalds、Linus (2018 年 6 月 5 日). 「[GIT PULL] v4.18-rc1 のデバイス プロパティ フレームワークの更新」 . Linux カーネル(メーリング リスト) 2018年8月15日閲覧実際のところ、共用体を使用して型パニングを行うことは、gcc で型パニングを行う伝統的かつ標準的な方法です。実際、それは gcc でそれを行う *文書化された* 方法であり、ばかげているときに "-fstrict-aliasing" を使用します ...
  28. ^ PDP-11/45 プロセッサ ハンドブック(PDF) . デジタル機器株式会社1973年。165. 2022 年 10 月 9 日にオリジナルからアーカイブ(PDF)
  29. ^ AMD64 Architecture Programmer's Manual Volume 2: System Programming (PDF) (テクニカルレポート)。2013年。80. 2018 年 2 月 18 日にオリジナル(PDF)からアーカイブ。
  30. ^ byteorder(3)  –  Linuxプログラマーズマニュアル– ライブラリ関数
  31. ^ endian(3)  –  Linuxプログラマーズマニュアル– ライブラリ関数
  32. ^ 「Intel 64 and IA-32 Architectures Software Developer's Manual Volume 2 (2A, 2B & 2C): Instruction Set Reference, AZ」(PDF) . インテル。2016 年 9 月。3–112。2022-10-09 のオリジナルからアーカイブ(PDF) . 2017 年 2月5 日閲覧
  33. ^ 「ARMv8-A リファレンス マニュアル」 . アームホールディングス
  34. ^ 「Microsoft Office Excel 97 - 2007 バイナリ ファイル形式の仕様 (*.xls 97-2007 形式)」 . マイクロソフト。2007年。
  35. ^ マット・アーレンズ (2016). FreeBSD Kernel Internals: An Intensive Code Walkthrough . OpenZFS ドキュメンテーション/Read Write Lecture。
  36. ^ レイノルズ、J .; Postel, J. (1994 年 10 月)。「データ表記」 . 割り当てられた番号IETFp。3.ドイ: 10.17487/RFC1700 . STD 2。RFC 1700 2012 年3 月 2 日閲覧
  37. ^ Ethernet POWERLINK Standardization Group (2012)、 EPSG Working Draft Proposal 301: Ethernet POWERLINK Communication Profile Specification Version 1.1.4、第 6.1.1 章。
  38. ^ IEEE およびオープン グループ (2018). 「3. システム インターフェイス」。オープン グループ基本仕様の問題 7巻。2.p。1120 . 2021 年4 月 9 日閲覧
  39. ^ "htonl(3) - Linux man ページ" . linux.die.net 2021 年4 月 9 日閲覧
  40. ^ 参照。秒。2.1 draft-ietf-pppext-sonet-as-00 のビット伝送「PPP over SONET/SDH の適用に関する声明」