web-dev-qa-db-ja.com

エンディアンを決定するもの

  1. エンディアンはCPUだけに依存するのだろうか?
  2. メモリ、セカンダリストレージデバイスなどの他のハードウェアに依存しますか?
  3. OSに依存しますか?なぜ ウィキペディア で、それは本当のように見えますか?
9
Tim

エンディアンは約数値データ数値が大きすぎて1バイトに収まらない場合。例えば。 ASCIIテキストは行の単なるバイトであり、エンディアンには関係ありません。

42のような小さな数値を32ビット(4バイト)整数に入れると、ビッグエンディアン(BE)の最後のバイトだけが使用されていることがわかります。 およびリトルエンディアン(LE)では、最初のバイトのみが使用されます

_|    | byte[0] | byte[1] | byte[2] | byte[3] |
|----+---------+---------+---------+---------|
| BE |       0 |       0 |       0 |      42 |
| LE |      42 |       0 |       0 |       0 |
_

アーキテクチャのエンディアンはCPUのエンディアンです。 RAMは数学を行わないので、気にしません。

サウンドカードのようなデバイスは問題ありませんが(たとえば、16ビット44100kHzオーディオはほとんどBEです)、CPUに変換するように指示するのはオペレーティングシステム(デバイスドライバー)の責任です。サウンドカードに送信する前のエンディアン。

ネットワークでは、ほとんどすべてがビッグエンディアンであるため、OSはリトルエンディアンプロセッサにバイトスワップ整数をネットワークパケットと同じように指示する必要があります。構築されました。

ファイルシステムには両方の目的があります。例えば。 FAT32はLEであるため、FAT32を使用する場合は、BEアーキテクチャのみがバイトスワッピングを実行する必要があります。

Cネットワークプログラミングでは、htonl()関数とntohl()関数を使用して、ホスト(ネイティブ)とネットワークのバイト順序を変換することを忘れないでください。プログラムがビッグエンディアンシステムでコンパイルされている場合、関数は何もしません。リトルエンディアンシステムでは、バイト順序を入れ替えます。


アーキテクチャのエンディアンはバイトレベルのものです。アーキテクチャのエンディアンを考慮する場合、ビットの順序/番号付けはほとんど関係ありません。しかし、知っておくのはいつでもいいことです:)

ほぼLSB(最下位ビット)が最初にビットワールドのLEであり、MSB(最上位ビット)が最初にビットワールドのBEです。

ほとんどのCPUおよびシリアルバスは、SPARCなどのビッグエンディアンシステムでも(驚くべきことに)LSBのようです。 また、イーサネットはLSBですが、バイトはほとんどビッグエンディアンの順序になります。一方、たとえばPPCはビッグエンディアンであり、MSBが最初です。

11
jkj
  1. CPUはエンディアンを制御します。いくつかのCPUは、ビッグエンディアンとリトルエンディアンを切り替えることができます。 x86/AMD64アーキテクチャには、この機能はありません。

  2. エンディアンは、CPUに命令をロードおよびストアする暗黙的なものです。 1バイト(0〜255)に収まらないデータは、一連の複数バイトで読み書きする必要があり、明らかにそれらのバイトは一貫した順序で読み書きする必要があります。 CPUの設計者は、レジスタのバイトの読み取りと書き込みの順序も選択する必要があります。データがCPUまたはRAMを離れることがない場合、順序は重要ではありませんが、I/Oレジスタ(同じ順序を期待しない可能性があります)やディスクセクター(他のシステムがデータを読み取る可能性がある)へのデータの書き込みなどに入る場合)それが重要になり、外部標準が必要になります。この規格は通常、ハードウェア仕様またはファイル形式仕様の一部です。彼の塩に値するプログラマー/デザインは、これを考慮して永続性フォーマットをデザインしようとしています。悪いプログラミングや、常に単一のアーキテクチャーで読み取られると想定しているプログラミングは、障害を明らかにする可能性があります。

  3. OSはI/Oレジスタとディスクセクターを多用するため、ここでは#2が適用されます。すべてのCPUに共通の標準を必要とする特に重要な領域の1つは、ファイルシステムの実装です。これが、Debianのmipsビルドとmipselビルドが別々にある理由です。

14
LawrenceC

エンディアンは、プロセッサが2進数のビットを配置する順序です。 RAMは、データが保存される順序を気にせず、ハードドライブも気にしません(データストリーム自体の内容に対してアクションを実行しないため、プロセッサからディレクティブを実行するだけです)。/chipset on where it。)オペレーティングシステムは、両方のエンディアンネス(Mac OS Xなど)で動作するように構築できます。

3
Andrew Lambert

エンディアンは必ずしもCPUに依存しません。たとえば、イーサネットとほとんどのTCP/IP低レベルプロトコルは、CPUに関係なくビッグエンディアンであり、x86ベースのマシンでもインターネットに接続できることを願っています。同様に、ビッグエンディアンCPUで実行されているOSは、リトルエンディアンファイルシステムであるFAT32を読み取るか、リトルエンディアンPCIカードを使用します。

2
jlliagre