[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を示すようになります。
なので実行時にバイトオーダーが判別できるというわけです。
