ビット演算子とエンディアン

エンディアンは、メモリ内のデータのレイアウトにのみ関係します。処理対象のデータがプロセッサによって読み込まれるとすぐに、エンディアンはまったく関係ありません。エンディアンに関係なく、シフト、ビット演算などは期待どおりに実行されます (データは論理的に下位ビットから上位ビットへと配置されます)。


ビットごとの演算子は、エンディアンを抽象化します。たとえば、>> 演算子は常にビットを最下位桁に向かってシフトします。ただし、これは、それらを使用するときにエンディアンを完全に無視しても安全であることを意味するものではありません。たとえば、より大きな構造で個々のバイトを処理する場合、それらが同じ場所にあると常に想定できるとは限りません。

short temp = 0x1234;
temp = temp >> 8;

// on little endian, c will be 0x12, on big endian, it will be 0x0
char c=((char*)&temp)[0];

明確にするために、私はここでの他の回答と基本的に意見が一致していません。ここで強調したいのは、ビット単位の演算子は基本的にエンディアン ニュートラルですが、特に他の演算子と組み合わせると、コード内のエンディアンの影響を無視できないということです。


他の人が述べたように、シフトは C 言語仕様によって定義され、エンディアンとは無関係ですが、右シフトの実装は、アーキテクチャが 1 の補数または 2 の補数演算を使用するかどうかによって異なる場合があります。