ビットシフトはエンディアンに依存しますか? 質問する

ビットシフトはエンディアンに依存しますか? 質問する

次のような数字が'numb'=1025 [00000000 00000000 00000100 00000001]表されているとします:

リトルエンディアンマシンの場合:

00000001 00000100 00000000 00000000

ビッグエンディアンマシンの場合:

00000000 00000000 00000100 00000001

ここで、10 ビットに左シフトを適用すると (つまり、numb <<= 10)、次のようになります。

[A] リトルエンディアンマシンの場合:

GDB で気づいたように、リトルエンディアンは左シフトを 3 つのステップで実行します。[処理を理解しやすくするために '3' ステップのみを示しました]

  1. 番号をビッグエンディアン規則で処理します。

    00000000        00000000        00000100    00000001
    
  2. 左シフトを適用:

    00000000        00010000        00000100        00000000
    
  3. 結果をリトルエンディアンで再度表します。

    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では、ベクトルシフトと回転はエンディアンに依存します。ベクトルレジスタに値を持ち、シフトレジスタに値を持つことができます。リトルエンディアンとビッグエンディアンでは異なる結果が生成される

おすすめ記事