web-dev-qa-db-ja.com

Cを使用してプログラムでPCのエンディアンを見つけるにはどうすればよいですか?

重複の可能性:
C++プログラムでプログラム的にエンディアンを検出する

PCのエンディアンを見つけるために利用できるライブラリ関数はありますか?

14
Dinesh

このように見つけることができるのに、なぜライブラリが必要なのですか? :)

int num = 1;

if (*(char *)&num == 1)
{
    printf("Little-Endian\n");
}
else
{
    printf("Big-Endian\n");
}
51
COD3BOY

私はライブラリ関数を知りません。

整数のアドレスを取得し、そのアドレスを文字ポインターとして扱い、整数を構成するバイトにデータを書き込むことができます。次に、実際に整数に含まれているものを読み取り、ビッグエンディアンまたはリトルエンディアンのアーキテクチャと一致する結果が得られるかどうかを確認します。

6
Eric J.

このコードを使用します:

union 
{
    uint8  c[4];
    uint32 i;
} u;

u.i = 0x01020304;

if (0x04 == u.c[0])
    printf("Little endian\n");
else if (0x01 == u.c[0])
    printf("Big endian\n");
5
Kamyar Souri

これを行うための標準関数はありません(C標準またはPOSIX標準のように)。

お使いのPCがIntelを実行している(Windowsスタイルの)PCである場合、それはリトルエンディアンです。

マシンでバイトオーダーを見つけたい場合は、この手法の完全に定義されていない動作を使用できます(ただし、通常は機能します。機能しないことはどこにも聞いたことがありません)。

enum { BigEndian, LittleEndian };

int endianness(void)
{
    union
    {
        int  i;
        char b[sizeof(int)];
    } u;
    u.i = 0x01020304;
    return (u.b[0] == 0x01) ? BigEndian : LittleEndian;
}

このコードは、(64ビットまたは16ビットではなく)32ビットのint型を想定しています。

1