[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で初期化した場合メモリ上のデータの配置が リトルエンディアンなら

番地0123
0x10x00x00x0

ビッグエンディアンなら

番地0123
0x00x00x00x1

となります。

アドレスを取得すると先頭アドレスは表の0番地を指します。

そのアドレスを1バイトのcharのポインタにキャストします。

するとcharポインタの実体は、リトルエンディアンなら1、ビッグエンディアンなら0を示すようになります。 なので実行時にバイトオーダーが判別できるというわけです。