: O. Yuanying

Byte Order の違いによるシフト演算の理解で混乱した

例えば、

char i[4] = {0,0,0,1};
unsigned int rtn = (*(unsigned int*)i);

printf("%d", rtn); // LE => 16777216, BE => 1

とした場合、rtn の値は、リトルエンディアンでは 16777216 になるし、ビッグエンディアンでは 1 になる。

変数 rtn の実際のバイトの並びは {0,0,0,1} なんだからリトルエンディアンだろうがビッグエンディアンだろうが、 3個左シフトしたら {1,0,0,0} になるんだろうと思ったのが、そんなことはない。

char i[4] = {0,0,0,1};
unsigned int rtn = (*(unsigned int*)i);
rtn = rtn << 24;

printf("%d", rtn); // LE=> 0, BE => 16777216

実際のメモリのバイトの並び順で言えば、リトルエンディアンでいう左シフトは右シフトのこと?

char i[4] = {0,0,0,1};
unsigned int rtn = (*(unsigned int*)i);
rtn = rtn >> 24;

printf("%d", rtn); // LE=> 1, BE => 0

ややこしすぎる!