4

これは、実行時にエンディアンを検出するために使用される一般的なトリックです。たとえば、C FAQで見られます。

int x = 1;

if (*(char *)&x == 1)
{
  /* little-endian */
}
else
{
  /* big-endian */
}

標準を読んだところによると、厳密なエイリアシング規則に違反しないため、未定義の動作にはなりません。

ともあれ、以外の整数型unsigned charにパディングビット( など)を入れることができれば、たとえリトルエンディアン系であってもx条件を間違えるのではないでしょうか?*(char *)x == 1

その場合、ユニオンを使用したソリューションはこれを行うのに適していますか?

4

1 に答える 1

4

パディングビットがある場合、エンディアンが本当に意味があるかどうかはわかりませんが、そうでない場合は正しく、条件が間違っている可能性があります。文字型にはトラップ表現がないため、少なくとも未定義の動作を呼び出していません。

それ以外の場合は、正確な幅の整数型 ( など) を使用することができますuint32_t。これらのタイプはオプションですが、パディング ビットがないことが保証されています。

signed char情報については、パディング ビットも使用できないことに注意してください。

于 2013-01-11T18:00:26.100 に答える