1. ホーム
  2. c

[解決済み] ビットシフトはエンディアンに依存するか?

2022-04-22 18:27:23

質問

という数字があるとします。 'numb'=1025 [00000000 00000000 00000100 00000001] を表現しています。

リトル・エンディアン・マシンについて。

00000001 00000100 00000000 00000000

Big-Endian Machineについて。

00000000 00000000 00000100 00000001

ここで、10ビットに左シフトをかけると(つまり、numb <<= 10)、こうなるはずだ。

[A] Little-Endian Machineで。

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

  1. ビッグエンディアン条約でNo.を処理する。

    00000000        00000000        00000100    00000001
    
    
  2. Left-Shiftを適用します。

    00000000        00010000        00000100        00000000
    
    
  3. 結果をもう一度リトルエンディアン語で表現してください。

    00000000        00000100        00010000        00000000 
    
    

[B]. Big-Endian Machineで。

00000000        00010000        00000100        00000000


私の質問です。

リトルエンディアンの左シフトを直接適用した場合 という規約があるはずです。

numb :

00000001 00000100 00000000 00000000

numb << 10 :

00010000 00000000 00000000 00000000

でも実は、与えるんです。

00000000        00000100        00010000        00000000 

2番目の結果だけを得るために、上記では3つの仮想的なステップを示しました。

上記の2つの結果が異なる理由を教えてください:実際の結果は numb << 10 が期待される結果と異なる。

どのように解決するのですか?

エンディアンとは、メモリにおける値の格納方法のことです。プロセッサにロードされた場合、エンディアンに関係なく、ビットシフト命令はプロセッサのレジスタの値に対して動作しています。したがって、メモリからプロセッサへのロードはビッグエンディアンに変換することと同じで、シフト動作が次に来て、新しい値がメモリに戻され、そこで再びリトルエンディアンのバイトオーダーが有効になるのです。

更新、@jwwに感謝。PowerPC では、ベクターシフトとローテートはエンディアンに依存します。ベクターレジスターに値があり、その値をシフトすることができます。 はリトルエンディアンとビッグエンディアンで異なる結果をもたらします。 .