C でのプログラムによるエンディアンネスの検出
データ構造内のバイトの順序を示すプロパティであるエンディアンネスは、クロスアーキテクチャにとって重要ですコードの互換性。 C には、条件付きコンパイルを行わずにプログラムでエンディアンを検出する方法があります。
この方法を理解するために、共用体の概念を詳しく調べます。 C の共用体は、複数のデータ型を 1 つの構造に結合し、同じメモリ空間を共有します。共用体を利用すると、異なるデータ形式で同じデータにアクセスでき、エンディアンを検出する賢いソリューションが提供されます。
次のコード スニペットを考えてみましょう。
bool is_big_endian(void) { union { uint32_t i; char c[4]; } bint = { 0x01020304 }; return bint.c[0] == 1; }
このコードでは、 i という名前の 32 ビット整数 (uint32_t) と c という名前の 4 つの文字の配列を含む共用体を定義します。共用体を値 0x01020304 で初期化します。ここで、最上位バイトは 0x01 です。
システムがビッグ エンディアンの場合、最上位バイトは配列 c の最初のバイトに格納され、bint になります。 c[0] は 1 に等しい。対照的に、システムがリトルエンディアンの場合、最下位バイトは c の最初のバイトに格納され、結果は次のようになります。 bint.c[0] は 4 に等しい。
bint.c[0] を 1 と比較することで、システムのエンディアンを決定できます。この方法は効果的であり、コンパイラ警告を生成する可能性がある型パニングの使用を回避します。さらに、C99 標準に準拠し、複数のアーキテクチャをサポートする OS に準拠しています。
以上がC でエンディアンネスをプログラム的に決定するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。