2011-12-20 24 views

答えて

47

なぜこのようなライブラリが必要なのでしょうか? :)

int num = 1; 

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

@Eric J.が以下のように動作する理由を説明できるかもしれません – bjackfly

+9

int num = 1はエンディアンに応じて000.0001または100.000として保存されます。 (char *)&numはそのintの最初のバイトを指します。そのバイトが1であればリトルエンディアン、そうでなければビッグエンディアンとなります。 – hasanatkazmi

+1

@hasanatkazmiコンピュータが数値を2バイトまたは4バイトで保存するかどうかをどのように知っていますか?また、なぜ7ビットを使用していますか? –

5

私はライブラリ機能を認識していません。

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

1

(C標準やPOSIX標準のように)標準的な機能はありません。

ご使用のPCがインテルを実行している(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タイプを想定しています。

+0

なぜ 'u.i = 1。 return u.b [0] == 1? LittleEndian:BigEndian; '?そうすれば、intサイズについて心配する必要はありません。 –

+0

@MartinBonner:それも動作します。 –

5

使用このコード:

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"); 
+0

"else if"は必要ありません。リトルエンディアンでなければ、それは大きなエンディアンです。 – Artur

+2

@Artur:ハッハッハ!他の選択肢があります:PDP11は、ビッグエンディアンの順序で16ビットワードを使用しました...リトルエンディアンの順序でワードのバイトを使用しました(これは逆でした。 –

関連する問題