次のような数字が'numb'=1025 [00000000 00000000 00000100 00000001]
表されているとします:
リトルエンディアンマシンの場合:
00000001 00000100 00000000 00000000
ビッグエンディアンマシンの場合:
00000000 00000000 00000100 00000001
ここで、10 ビットに左シフトを適用すると (つまり、numb <<= 10)、次のようになります。
[A] リトルエンディアンマシンの場合:
GDB で気づいたように、リトルエンディアンは左シフトを 3 つのステップで実行します。[処理を理解しやすくするために '3' ステップのみを示しました]
番号をビッグエンディアン規則で処理します。
00000000 00000000 00000100 00000001
左シフトを適用:
00000000 00010000 00000100 00000000
結果をリトルエンディアンで再度表します。
00000000 00000100 00010000 00000000
[B] ビッグエンディアンマシンの場合:
00000000 00010000 00000100 00000000
私の質問は次のとおりです:
リトルエンディアン規則に左シフトを直接適用すると、次のようになります。
numb
:
00000001 00000100 00000000 00000000
numb << 10
:
00010000 00000000 00000000 00000000
しかし、実際には次のようになります。
00000000 00000100 00010000 00000000
2 番目の結果のみを達成するために、上記で 3 つの仮説的な手順を示しました。
上記の 2 つの結果が異なる理由を説明してください。実際の結果はnumb << 10
予想される結果とは異なります。
ベストアンサー1
エンディアンとは、値がメモリに格納される方法です。プロセッサにロードされると、エンディアンに関係なく、ビット シフト命令はプロセッサのレジスタ内の値に対して実行されます。したがって、メモリからプロセッサにロードすることはビッグ エンディアンに変換することと同じであり、次にシフト操作が行われ、その後新しい値がメモリに格納され、ここで再びリトルエンディアンのバイト順序が有効になります。
更新、@jwwさんに感謝します: PowerPCでは、ベクトルシフトと回転はエンディアンに依存します。ベクトルレジスタに値を持ち、シフトレジスタに値を持つことができます。リトルエンディアンとビッグエンディアンでは異なる結果が生成される。