ビットごとの演算子と「エンディアン」
-
22-07-2019 - |
解決
エンディアンネスは、メモリ内のデータのレイアウトにのみ関係します。データが処理対象のプロセッサによってロードされるとすぐに、エンディアンネスは完全に無関係になります。シフト、ビット演算などは、エンディアンに関係なく、期待どおりに実行されます(データは下位ビットから上位に論理的にレイアウトされます)。
他のヒント
ビット演算子は、エンディアンを抽象化します。たとえば、>>
演算子は常にビットを最下位桁にシフトします。ただし、これは使用時にエンディアンを完全に無視しても安全であるという意味ではありません。たとえば、より大きな構造の個々のバイトを扱う場合、必ずしも同じ場所にあるとは限りません。
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の補数演算を使用する場合に応じて異なります。
状況によります。数値を新しい型にキャストせずに、エンディアンを透過的に扱うことができます。
ただし、操作に新しい型キャストが含まれる場合は、注意してください。
たとえば、いくつかのビットを右にシフトし、(明示的かどうかにかかわらず)新しい型にキャストする場合、エンディアンが重要です!
エンディアンをテストするには、単に int
を char
にキャストします:
int i = 1;
char *ptr;
...
ptr = (char *) &i; //Cast it here
return (*ptr);
言語は指定していませんが、通常はビット単位の操作でCの抽象エンディアンなどのプログラミング言語を指定しません。いいえ、ビット単位の操作では問題ありません。