![リトルエンディアンとビッグエンディアンでの最下位ビットの計算](https://rvso.com/image/1395311/%E3%83%AA%E3%83%88%E3%83%AB%E3%82%A8%E3%83%B3%E3%83%87%E3%82%A3%E3%82%A2%E3%83%B3%E3%81%A8%E3%83%93%E3%83%83%E3%82%B0%E3%82%A8%E3%83%B3%E3%83%87%E3%82%A3%E3%82%A2%E3%83%B3%E3%81%A7%E3%81%AE%E6%9C%80%E4%B8%8B%E4%BD%8D%E3%83%93%E3%83%83%E3%83%88%E3%81%AE%E8%A8%88%E7%AE%97.png)
私が調べたところによると、リトルエンディアンは最下位バイトを最小のメモリ アドレスに格納し、ビッグエンディアンは最上位バイトを最小のメモリ アドレスに格納します。
しかし、重要なバイトを計算して比較する方法がわかりません。
例えば、このサイト下の画像は、4 バイト、90、AB、12、CD がリトルエンディアン形式でメモリ アドレスに格納される様子を示しています。
4 つのバイトのうち、どのバイトが大きいかを比較するにはどうすればよいでしょうか。まずすべてを 16 進数値に変換し、次に 10 進数値に基づいて比較しましたが、この方法ではうまくいかないようです。
205 > 18 ですが、CD は最小のメモリ アドレスに格納されます。つまり、私は間違っています。
ご説明いただければ幸いです。
Treating CD as a hex value, with a decimal value of 205.
Treating 12 as a hex value, with a decimal value of 18.
Treating AB as a hex value, with a decimal value of 171.
Treating 90 as a hex value, with a decimal value of 144.
答え1
リンク先の Web ページには、エンディアンに関する非常にわかりにくい説明が含まれていると思います。
ワード内の個々のバイトの実際の値は、メモリ内のどこに格納されているかとは関係なく、4 バイトのワード全体の一部としての位置にのみ関係します。
エンディアンは複数バイトのワードにのみ適用されます。この場合、次の 4 バイトのワードがあります。
Decimal Hex Binary
2427130573 90 AB 12 CD 10010000 10101011 00010010 11001101
これはビッグエンディアン表現であり、最上位バイト ( 0x90
) が最初にメモリ内、または最下位のメモリ アドレスに格納されます。
リトルエンディアン表現では、バイトはメモリ内で次のように単純に反転されます。
Decimal Hex Binary
2427130573 CD 12 AB 90 11001101 00010010 10101011 10010000
ここで、最下位バイト ( 0xCD
) が最初にメモリ内、つまり最下位のメモリ アドレスに格納されます。
関係するバイトの実際の値によってメモリ内の位置が決まるのではなく、ワード全体における位置のみが決まることがわかります。
エンディアンの概念は、リンク先の記事で説明されているように CPU アーキテクチャにまで遡り、両方の方法に長所と短所があります。
人間が数字を考える最も自然な方法はビッグエンディアンです。これは、10 進数をこのように扱うためです。あなたの場合、10 進数は2427130573
ビッグエンディアン表記で書かれていると言えます。つまり、最上位桁 ( 2
) が最初に書かれ、右に行くにつれて重要性が減少します (つまり、左端の桁の値を変更すると、数値の値に最も大きな影響があります)。そのように読むことが3750317242
わかっている限り、最下位桁を最初にして左から右に数字を書くこともできます (編集: ちなみに、これが、オペレーティング システムがファイルの解釈方法を認識できるように、Unicode ファイルの最初の 2 バイトにバイト オーダー マーク (BOM) を格納する必要がある理由です)。
ただし、コンピューターが計算を実行するには、最下位バイトを最初に保存するのが最も効率的であることがよくあります。ビッグ エンディアンとリトルエンディアンに関する議論は別の議論のトピックであり、これについてはオンライン上に多くの情報源があると思います。
これで多少は理解が深まるかと思います。