What is it, naokirin?

共用体を用いたバイト構造の判別

11月です。暖房のきいた眠くなるような空間が増える季節です。

そのせいで冬はよく寝ます。
そして、肩が冷えるので肩こりになりやすいです。


ところで、ビッグエンディアンとリトルエンディアンって、プログラム上ではどうやったら簡単に見分けられるかなあ、と考えていたところ、答えが転がっていたのでメモ。

union
{
    unsigned long bits32;
    unsigned char bytes[4];
}endianValue;

endianValue.bytes[0] = 0;
endianValue.bytes[1] = 1;
endianValue.bytes[2] = 0;
endianValue.bytes[3] = 0;

isLittleEndian = (endianValue.bits32 == 256)

このisLittleEndianがtrueであれば、リトルエンディアンバイト構成、falseであればビッグエンディアンバイト構成であることが判別できます。

仕組みは簡単で、下位ビットに寄せて0100を並べると、(100000000)2=(256)10となります。これはリトルエンディアンバイト構成のときに上のコードのendianValue.bits32がとる値です。

しかし、これがビッグエンディアンバイト構成だったら、(32ビットで) (10000000000000000)2=(65536)2となります。

もちろんこれは32ビットであることを前提にした話です。おそらく仕組み的にはあまり低いビットのコンピュータや24ビット(ちょうど上の判定をするとどちらも256になる)変わり種のコンピュータでなければ問題はないのではないかと思います。