システムのエンディアンを判別するために、マルチバイト整数値を変数に格納し、 ;でラップされたものを介して最初のバイトにアクセスすることを計画しています。例えば:unsigned char
union
union{
unsigned int val;
unsigned char first_byte;
} test;
test.val = 1; /* stored in little-endian system as "0x01 0x00 0x00 0x00" */
if(test.first_byte == 1){
printf("Little-endian system!");
}else{
printf("Big-endian system!");
}
このテストをプラットフォーム間で移植可能にしたいのですが、C99標準でデータ型のサイズが1バイトunsigned int
を超えることが保証されているかどうかはわかりません。さらに、「Cバイト」は技術的には8ビットのサイズである必要はないため、正確な幅の整数型(たとえば、など)を使用することはできません。uint8_t
uint16_t
C99標準で少なくとも2バイトのサイズが保証されているCデータ型はありますか?
PSunsigned int
が実際に1バイトより大きいと仮定すると、すべてのC99互換プラットフォームで(変数が変数の最初のバイトにアクセスすることで)union
期待どおりに動作しますか?first_byte
val