[c/c++] 実行時にバイトオーダを調べる
バイトオーダーを考慮してプログラムを組む必要があるときに超お手軽にバイトオーダーを判定する関数の作り方
#include <stdio.h>
int islittle(void)
{
unsigned i = 1;
return *((char *)&i);
}
int main(int argc, char const *argv[])
{
if (islittle())
{
printf("little endian\n");
}
else
{
printf("big endian\n");
}
}
原理は以下の通りです。unsigned
を4バイトと仮定して1
で初期化した場合メモリ上のデータの配置が
リトルエンディアンなら
番地 | 0 | 1 | 2 | 3 |
---|---|---|---|---|
値 | 0x1 | 0x0 | 0x0 | 0x0 |
ビッグエンディアンなら
番地 | 0 | 1 | 2 | 3 |
---|---|---|---|---|
値 | 0x0 | 0x0 | 0x0 | 0x1 |
となります。
アドレスを取得すると先頭アドレスは表の0
番地を指します。
そのアドレスを1バイトのchar
のポインタにキャストします。
するとchar
ポインタの実体は、リトルエンディアンなら1
、ビッグエンディアンなら0
を示すようになります。
なので実行時にバイトオーダーが判別できるというわけです。