エンディアンネス

ウィキペディアから、無料の百科事典
ナビゲーションにジャンプ 検索にジャンプ

計算エンディアンは、の順序またはシーケンスであるバイトワードでデジタルデータのコンピュータメモリ。エンディアンは、主にビッグエンディアンBE)またはリトルエンディアンLEとして表されます。ビッグエンディアンシステムは、ワードの最上位バイトを最小のメモリアドレスに格納し、最下位バイトを最大のメモリアドレスに格納します。対照的に、リトルエンディアンシステムは、最下位バイトを最小アドレスに格納します。

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

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

内部的には、ハードウェアがデータの保存とロードの両方に一貫して同じエンディアンを使用するため、どのコンピューターも、使用するエンディアンに関係なく同じように機能します。このため、プログラマーとコンピューターユーザーは通常、使用しているコンピューターのエンディアンを無視します。ただし、異なるコンピューター間でデータを送信する場合や、コンピューターの内部バイトのデータをメモリダンプから調査する場合など、コンピューターの外部にデータを移動する場合は、エンディアンが問題になる可能性があり、使用されるエンディアンは予想とは異なります。このような場合、データのエンディアンを理解して説明する必要があります。バイエンディアン は、データのフェッチとストア、または命令のフェッチで切り替え可能なエンディアンを備えた多数のコンピュータアーキテクチャでサポートされている機能です。

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

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

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

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

左側の図は、ビッグエンディアンを使用しているコンピューターを示しています。これは、と整数の格納開始最も-significantバイトは0x0Aをアドレスで、Aとし、両端少なくとも-significantバイト、0x0Dのアドレスで、A + 3

右側の図は、リトルエンディアンを使用しているコンピューターを示しています。これは、と整数の格納を開始する少なくとも-significantバイト、0x0Dを、アドレスにA、で終わる最も-significantバイトは0x0A、アドレスでA + 3

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

語源

ダニー・コーエンは、用語を導入ビッグエンディアンリトルエンディアンのデータの順序のためのコンピュータサイエンスにインターネット実験ノートに掲載されたが1980年[3] [4] [5] [6]

形容詞のエンディアンは、18世紀のアングロアイリッシュの作家ジョナサンスウィフトの著作に端を発しています。1726年の小説「ガリバー旅行記」では、ゆで卵の殻を大きな端から、または小さな端から壊すものに分けられたリリパットの宗派間の対立を描いています。彼はそれらをビッグエンディアンリトルエンディアン呼んだ[7] [8]コーエンは、1980年のノートの付録で、ガリバー旅行記との関係を明確にしています。

基本

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

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

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

数字

位置番号システム(ほとんどの場合、基数10、基数2、または8ビットバイトの場合は基数256)は、コンピューターによる整数データの表現、特に操作の主な方法です。純粋な形式では、これは中程度のサイズの非負の整数、たとえばCデータ型に有効ですunsignedそのような番号システムでは、が整数に寄与する桁の単一の桁としてのその値によってだけでなく、それはその重要性と呼ばれる完全な数に保持する位置によってのみならず、決定されます。これらの位置は、主に2つの方法でメモリにマッピングできます。[9]

  • ビッグエンディアンおよびとして知られる、メモリアドレスの増加(または時間の増加)に伴う数値の重要性の減少
  • リトルエンディアンとして知られる、メモリアドレスの増加(または時間の増加)に伴う数値の重要性の増加【注2】

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

以下のための浮動小数点数の、参照ポイントを浮動§

テキスト

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

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

ハードウェア

歴史

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

IBMのSystem / 360の用途ビッグエンディアンバイト順は、としてその後継行うシステム/ 370ESA / 390、およびZ /アーキテクチャPDP-10の用途は、ビッグエンディアンバイト指向命令をアドレッシング。IBMシリーズ/ 1ミニコンピュータは、ビッグエンディアンバイト順を使用しています。

異なるエンディアンのデータを処理することは、NUXI問題と呼ばれることもあります[10]この用語は、混合エンディアンPDP-11で実行されていたUNIXをビッグエンディアンIBM Series / 1コンピューターに適合させる ときに発生したバイト順序の競合を暗示しています。 Unixは、内部表現が異なるプラットフォーム用に同じコードをコンパイルできるようにした最初のシステムの1つでした。変換された最初のプログラムの1つは印刷されるはずでしたが、Series / 1では代わりに印刷されました。[11]UnixnUxi

データポイント2200は、容易にするためにリトルエンディアンとの単純なビット・シリアルロジック使用キャリー伝播を。 IntelがDatapoint用8008マイクロプロセッサを開発したとき、互換性のためにリトルエンディアンを使用していました。インテルが時間内に8008をお届けすることができませんでしたしかし、データポイントは、使用中規模集積相当するが、少し-エンディアンを含むほとんどのIntelのデザイン、中に保持されたMCS-488086のx86後継。[12] [13] 12月アルファアトメルAVRVAXMOS技術6502ファミリー(含みますWestern Design Center 65802および65C816)、Zilog Z80Z180およびeZ80を含む)、Altera Nios II、およびその他の多くのプロセッサとプロセッサフ​​ァミリもリトルエンディアンです。

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

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

SPARCは、バイエンディアンであるバージョン9まで、歴史的にビッグエンディアンを使用していました同様に、初期のIBM POWERプロセッサーはビッグエンディアンでしたが、PowerPCPowerISAの子孫は現在バイエンディアンです。ARMアーキテクチャでは、それはバイエンディアンになったとき、バージョン3の前にリトルエンディアンでした。

現在のアーキテクチャ

インテルのx86およびAMD64 / x86-64で一連のプロセッサは、リトルエンディアン形式を使用します。この規則に従い、リトルエンディアンモードのみを許可する他の命令セットアーキテクチャには、Nios IIAndes Technology NDS32、およびQualcommHexagonが含まれます。

一部の命令セットアーキテクチャでは、バイエンディアンアーキテクチャでいずれかのエンディアンのソフトウェアを実行できます。これには、ARM AArch64C-SkyPower ISA、およびRISC-Vが含まれます。

唯一のビッグエンディアンアーキテクチャには、IBM z / ArchitectureFreescale ColdFireMotorola 68000シリーズベース)、Atmel AVR32、およびOpenRISCが含まれます。IBM AIXのOracle Solarisバイエンディアンのオペレーティングシステムの電源ISASPARCビッグエンディアンモードで実行します。Linux on Powerの一部のディストリビューションは、リトルエンディアンモードに移行しました。

バイエンディアン

一部のアーキテクチャ(ARMバージョン3以降、PowerPCAlphaSPARC V9、MIPSPA-RISCSuperH SH-4IA-64を含む)は、データのフェッチとストア、命令のフェッチ、またはどちらも。この機能により、パフォーマンスが向上したり、ネットワークデバイスやソフトウェアのロジックが簡素化されたりします。ハードウェアについて言えば、バイエンディアンという言葉は、いずれかのエンディアン形式でデータを計算または渡すマシンの機能を示します。

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

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

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

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

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

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

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

最近のIntelx86およびx86-64アーキテクチャCPUにはMOVBE命令(第4世代以降のIntel CoreAtomの[16]があり、メモリからビッグエンディアン形式の単語をフェッチするか、ビッグエンディアン形式で単語​​をメモリに書き込みます。それ以外の場合、これらのプロセッサは完全にリトルエンディアンです。また、「間違った」エンディアンにあったメモリ位置からワードがすでにフェッチされている場合など、レジスタの内容のバイト順序を逆にするための一連のスワップ命令もすでにありました。

浮動小数点

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

VAX浮動小数点は、リトルエンディアンの16ビットワードをビッグエンディアンの順序で格納します。

可変長データ

これまでに検討されたほとんどの命令には、オペコード内のオペランドのサイズ(長さ)が含まれています頻繁に使用できるオペランドの長さは、1、2、4、8、または16バイトです。ただし、オペランドの長さを命令の別のフィールドに保持したり、ワードマークなどを使用してオペランド自体で保持したりできるアーキテクチャもありますこのようなアプローチでは、最大256バイトのオペランド長またはフルメモリサイズを使用できます。このようなオペランドのデータ型は、文字列またはBCDです。

1つの命令で、そのようなデータを操作することができるというマシンは、(例えば、追加の比較)例えばあるIBM 140114101620システム/ 3x0ESA / 390、およびZ /アーキテクチャ、型ビッグエンディアンのそれらのすべて。

最適化

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

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

ユニオン {
  uint8_t u8 ; uint16_t u16 ; uint32_t u32 ; uint64_t u64 ;       
} u = { u64 = 0x4A };       
プットU U8 == U U16 && U U8 == U U32 && U U8 == U U64 "真" "偽" );              

C ++では許可されていませんが、このような型のパンニングコードは、C11標準[19]で「実装定義」として許可されており、ハードウェアと対話するコードで一般的に使用されています[20][21]

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

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

計算順序

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

加算、減算、および乗算は、最下位桁の位置から始まり、キャリーを次のより重要な位置に伝搬します。最初の(=最小アドレス)バイトで複数桁のデータをアドレス指定することが、主要なアドレス指定スキームです。この最初のバイトに最下位桁が含まれている場合(これはリトルエンディアンに相当します)、これらの操作の実装はわずかに簡単です。

比較と除算は最上位桁から始まり、可能なキャリーを後続の最下位桁に伝播します。固定長の数値(通常は長さ1、2、4、8、16)の場合、これらの操作の実装は、ビッグエンディアンのマシンではわずかに簡単です。

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

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

ミドルエンディアン

一般にミドルエンディアンまたは混合エンディアンと呼ばれる他の多くの順序付けが可能です。[要出典]コンピュータサイエンス以外のそのような例の1つは、月/日/年の標準的なアメリカの日付形式です。

PDP-エンディアン

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

このエンディアンを解釈する方法は、32ビット整数をビッグエンディアンの2つの16ビットワードとして格納することですが、ワード自体はリトルエンディアンです(たとえば、「jagcogsin」は「gajgocnis」になります)。

PDP-11 での32ビット整数0x0A0B0C0Dのストレージ
アドレスの増加  →
..。 0B h 0A h 0D h 0C h ..。
..。 0A0B h 0C0D h ..。

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

IntelIA-32セグメント記述子

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

バイトアドレス指定

メモリバイトが左から右に順番に出力される場合(16進ダンプなど)、整数のリトルエンディアン表現の重要性は左から右に増加します。言い換えれば、視覚化すると後方に表示され、直感に反する可能性があります。

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

   'ジョン'
六角4A6F 68 6E
--------------------------------
   -> 0x4A6F686E

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

アドレスの増加  →
..。 4A h 6F h 68時間 6E h ..。
..。 'NS' 「o」 'NS' 'NS' ..。

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

アドレスの増加  →
..。 6E h 68時間 6F h 4A h ..。
..。 'NS' 'NS' 「o」 'NS' ..。

上記のHoneywell316のようなミドルエンディアンのマシンは、これをさらに複雑にします。32ビット値は2つの16ビットワード「hn」「Jo」としてリトルエンディアンで格納され、それ自体がビッグエンディアン表記(したがって「h」)になります。 'n''J''o')。

バイトスワッピング

バイトスワッピングは、各バイトをマスキングし、それらを正しい場所にシフトすることで構成されます。多くのコンパイラは、などのネイティブプロセッサ命令(/ )にコンパイルされる可能性が高い組み込みを提供しますスワッピング用のソフトウェアインターフェイスは次のとおりです。 bswapmovbe__builtin_bswap32

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

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

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

いくつかのCPUの命令セットのような、エンディアンバイトスワップのネイティブサポートを提供するbswap[25] x86の- 486以降)、およびrev[26] ARMv6の以降)。

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

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

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

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

そのような例のようなアプリケーションバイナリデータ形式、MATLAB .MATファイル、または.bilの地形で使用されるデータフォーマットは、通常エンディアンに依存しています。これは、データを常に1つの固定エンディアンに格納するか、データとともにエンディアンを示すスイッチを実行することによって実現されます。

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

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

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

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

ネットワーキング

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

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

バークレーソケット APIは、およびネットワークバイト順から16ビットおよび32ビットの整数に変換する関数のセットを定義し:htons(ホストからネットワーク短)およびhtonl(ホストとネットワーク長)関数は、16を変換しますマシン(ホスト)からネットワーク順序まで、それぞれビット値と32ビット値機能はネットワークからホスト順に変換します。[31] [32]これらの機能であってもよいノーオペレーションビッグエンディアンのシステムで。 ntohsntohl

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

ビットエンディアン

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

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

注意事項

  1. ^ この規則の例外は、たとえば、 IBM 1401のAdd命令です。これは、可変長フィールドを下位(最高アドレス)の位置でアドレス指定し、長さは上位(最低アドレス)に設定されたワードマークによって定義されます。対処済み)位置。加算などの演算を行うと、プロセッサは2つのフィールドの上位アドレスの下位から始まり、上位に向かって進みます。
  2. ^ これらの表現では、「終了」という用語は、大きな応答が発生する端を意味することに注意してください最初書かれる重要性はほとんどありませんつまり、フィールドが始まる場所です。
  3. ^ 1つの命令のみを使用してこれを実行できるほとんどすべてのマシン §可変長データを参照)は、いずれにせよビッグエンディアンまたは少なくとも混合エンディアンのタイプです。

参考文献

引用

  1. ^ 「RFC1700」
  2. ^ 「RFC1314–インターネットで画像を交換するためのファイル形式」datatracker.ietf.orgインターネットエンジニアリングタスクフォース1992年4月2021816日取得TIFFファイルは、ファイルで使用されるバイト順序(つまり、ビッグエンディアンまたはリトルエンディアン)を指定するファイルヘッダーで始まります。
  3. ^ コーエン、ダニー(1980-04-01)。聖戦と平和への嘆願についてIETFIEN 137. ...どのビットが最初に移動する必要がありますか、単語の小さい方の端からのビット、または単語の大きい方の端からのビットですか?前者のフォロワーはリトルエンディアンと呼ばれ、後者のフォロワーはビッグエンディアンと呼ばれます。IEEE Computer1981年10月号にも掲載されています。
  4. ^ 「インターネットの殿堂のパイオニア」インターネットの殿堂インターネットソサエティ
  5. ^ ケアリー、デビッド。「エンディアンFAQ」2010年10月11日取得
  6. ^ 「用語ビッグエンディアンとリトルエンディアンの起源」2004-01-21。
  7. ^ スウィフト、ジョナサン(1726)。ガリバー旅行記
  8. ^ ブライアント、ランダルE .; David、O'Hallaron(2016)、Computer Systems:A Programmer's Perspective(3 ed。)、Pearson Education、p。79、ISBN 978-1-488-67207-1
  9. ^ タネンバウム、アンドリューS。; オースティン、トッドM.(2012年8月4日)。構造化されたコンピュータ組織プレンティスホールPTR。ISBN 978-0-13-291652-3検索された18 5月2013
  10. ^ 「NUXI問題」ジャーゴンファイル2008年12月20日取得
  11. ^ ジャリックス、ポールJ。; ハインズ、トーマスS.(1983年12月1日)。「ポータブルオペレーティングシステムのトランスポート:UNIXからIBMミニコンピューターへ」。ACMの通信26(12):1066–1072。土井10.1145 /358476.358504S2CID 15558835 
  12. ^ 家、デビッド; ファジン、フェデリコ; フィーニー、ハル; ゲルバッハ、エド; ホフ、テッド; Mazor、Stan; スミス、ハンク(2006-09-21)。「Intel8008マイクロプロセッサの開発とプロモーションに関するオーラルヒストリーパネル」(PDF)コンピュータ歴史博物館NS。b5 取得した23年4月2014 Mazor:そして最後に、Datapointの元の設計...彼らが望んでいたのは[ビット]シリアルマシンでした。また、シリアルマシンについて考える場合、すべてのアドレスとデータを一度に1ビットずつ処理する必要があります。そのための合理的な方法は、低ビットから高ビットへのキャリーの伝播方法です。つまり、ジャンプ命令自体では、14ビットアドレスがシリアルマシンに配置される方法は、それを見るとビットバックワードであるということです。これは、それを処理したい方法だからです。さて、私たちはビットシリアルではなくバイトパラレルマシンを構築するつもりでした。妥協点として(顧客の精神と彼のためだけに)、バイトを逆方向に配置しました。下位バイトを[最初に]配置し、次に上位バイトを配置します。それ以来、これは「リトルエンディアン」フォーマットと呼ばれ、自然と思われるものとは逆になっています。良い、Datapointのためにそれを行いました。ご覧のとおり、彼らは[8008]チップを使用したことがなかったため、ある意味で「間違い」でしたが、その[リトルエンディアン形式]は8080と8086に受け継がれており、[は]マークの1つです。この家族の。
  13. ^ ケン・ランディ(2009年1月13日)。CJKV情報処理O'Reilly Media、Inc.p。29. ISBN 978-0-596-51447-1検索された21 5月2013
  14. ^ 「Cx51ユーザーズガイド:E。バイト順序」keil.com
  15. ^ 「BE-32バスとBE-8バスの違い」
  16. ^ 「第4世代インテル®Core™プロセッサー・ファミリーで新しい命令のサポートを検出する方法」(PDF)2017年5月2日取得
  17. ^ Savard、ジョン・JG(2018)[2005]、"浮動小数点フォーマット"quadiblocアーカイブ2018年7月3日に元から、取得した2018年7月16日を
  18. ^ 「パック–リストをバイナリ表現に変換する」
  19. ^ 「C11標準」ISO。セクション6.5.2.3「構造および連合メンバー」、§3および脚注95 2018年8月15日取得95)共用体オブジェクトの内容を読み取るために使用されたメンバーが、オブジェクトに値を格納するために最後に使用されたメンバーと同じでない場合、値のオブジェクト表現の適切な部分は、新しいオブジェクト表現として再解釈されます。 6.2.6で説明されているように型を設定します(「型のパンニング」と呼ばれることもあるプロセス)。
  20. ^ 「3.10最適化を制御するオプション:-fstrict-aliasing」GNUコンパイラコレクション(GCC)フリーソフトウェアファウンデーション2018年8月15日取得
  21. ^ Torvalds、Linus(2018年6月5日)。「[GITPULL] v4.18-rc1のデバイスプロパティフレームワークの更新」Linuxカーネル(メーリングリスト)2018年8月15日取得事実、型のパンニングを行うためにユニオンを使用することは、gccで型のパンニングを行うための従来の標準的な方法です。実際、moronを実行し、「-fstrict-aliasing」を使用する場合、これはgccに対して*文書化された*方法です...
  22. ^ PDP-11 / 45プロセッサハンドブック(PDF)Digital EquipmentCorporation1973年。p。165。
  23. ^ byteorder(3)  –  Linuxプログラマーマニュアル–ライブラリ関数
  24. ^ endian(3)  –  Linuxプログラマーマニュアル–ライブラリ関数
  25. ^ 「Intel64およびIA-32アーキテクチャソフトウェア開発者マニュアル第2巻(2A、2B、および2C):命令セットリファレンス、AZ」(PDF)インテル。2016年9月。p。3–112 2017年2月5日取得
  26. ^ 「ARMv8-Aリファレンスマニュアル」ARMホールディングス
  27. ^ 「MicrosoftOfficeExcel 97-2007バイナリファイル形式の仕様(* .xls 97-2007形式)」マイクロソフト。2007年。
  28. ^ Matt Ahrens(2016)。FreeBSDカーネル内部:集中的なコードウォークスルーOpenZFSドキュメント/読み取り/書き込み講義。
  29. ^ レイノルズ、J。; Postel、J。(1994年10月)。「データ表記」割り当てられた番号IETFNS。3. doi10.17487 / RFC1700STD 2. RFC 1700 2012年3月2日取得
  30. ^ イーサネットPOWERLINK標準化グループ(2012)、 EPSGワーキングドラフト提案301:イーサネットPOWERLINK通信プロファイル仕様バージョン1.1.4、第6.1.1章。
  31. ^ IEEEおよびTheOpen Group(2018)。「3.システムインターフェース」。OpenGroupの基本仕様の問題72NS。1120 2021-04-09を取得
  32. ^ "htonl(3)-Linuxのマニュアルページ"linux.die.net 2021-04-09を取得
  33. ^ Cf. Sec。2.1draft-ietf-pppext-sonet-as-00「PPPoverSONET / SDHの適用性ステートメント」のビット送信

さらに読む

外部リンク