web-dev-qa-db-ja.com

なぜリトルエンディアンとビッグエンディアンの両方が使用されているのですか?

バイナリコンピュータサイエンスの約40年後、なぜリトルエンディアンとビッグエンディアンの両方がまだ使用されているのですか今日?一方ではうまく機能し、もう一方でははるかに悪いアルゴリズムやストレージ形式はありますか?私たち全員が1つに切り替えて、それに固執したほうがいいのではないでしょうか。

44
orlp

(紙または機械で)2つの数字を加算するときは、最下位桁から始めて、最上位桁に向かって作業します。 (他の多くの操作についても同じことが言えます)。

16ビットレジスタで8ビットデータバスを備えたIntel8088では、リトルエンディアンであるため、このような命令は最初のメモリサイクルの後に動作を開始できました。 (もちろん、Wordのメモリフェッチを増加させるのではなく降順で実行することは可能ですが、これにより設計が少し複雑になると思います。)

ほとんどのプロセッサでは、バス幅がレジスタ幅と一致するため、これはもはや利点をもたらしません。

一方、ビッグエンディアンの数値は、MSBから開始して比較できます(ただし、多くの比較命令は実際には減算を実行するため、LSBから開始する必要があります)。サインビットも非常に簡単に入手できます。

一方ではうまく機能し、もう一方でははるかに悪いアルゴリズムやストレージ形式はありますか?

いいえ。あちこちに小さな利点がありますが、大きな利点はありません。

実際、リッテエンディアンの方が自然で一貫性があると思います。ビットの重要性は2 ^(bit_pos + 8 * byte_pos)です。一方、ビッグエンディアンの場合、ビットの重要性は2 ^(bit_pos + 8 *(Word_size-byte_pos-1))です。

私たち全員が1つに切り替えて、それに固執したほうがいいのではないでしょうか。

X86が優勢であるため、私たちは間違いなくリトルエンディアンに引き寄せられました。多くのモバイルデバイスのARMチップには設定可能なエンディアンがありますが、x86の世界との互換性を高めるためにLEに設定されることがよくあります。これは私にとっては問題ありません。

31
Artelius

リトルエンディアンを使用すると、タイプキャストが簡単になります。たとえば、16ビットの数値がある場合、同じメモリアドレスには最下位の8ビットが含まれているため、8ビットの数値へのポインタとして扱うことができます。したがって、扱っている正確なデータ型を知る必要はありません(ただし、ほとんどの場合、とにかく知っています)。

ビッグエンディアンはもう少し人間が読める形式です。ビットは、人間が使用する記数法の場合と同様に、論理的な順序で(最上位の値が最初に)表示されるとおりにメモリに格納されます。

しかし、多くの場合、多くの抽象化レイヤーでは、これらの引数は実際にはカウントされなくなります。私たちがまだ両方を持っている主な理由は、誰も切り替えたくないということだと思います。どちらのシステムにも明らかな理由はありません。古いシステムが完全に機能するのに、なぜ何かを変更するのでしょうか。

14
Daniel Stelter

ビッグエンディアンとリトルエンディアンの両方に長所と短所があります。明らかに優れていたとしても(そうではありません)、レガシーアーキテクチャがエンディアンを切り替えることができる方法はないので、それと一緒に暮らすことを学ぶ必要があるのではないかと思います。

3
Paul R