4

プラットフォームのエンディアンを知る方法はこのプログラムだと思いますが、理解できません

#include <stdio.h>
int main(void)
{
  int a = 1;
  if( *( (char*)&a ) == 1) printf("Little Endian\n");
  else printf("Big Endian\n");
  system("PAUSE");  
  return 0;
}

テストは何をしますか?

4

8 に答える 8

9

Anintはほとんどの場合 1 バイトより大きく、多くの場合、アーキテクチャのワード サイズを追跡します。たとえば、32 ビット アーキテクチャには 32 ビットの int がある可能性があります。したがって、典型的な 32 ビット整数を考えると、4 バイトのレイアウトは次のようになります。

   00000000 00000000 00000000 00000001

または最下位バイトを最初に:

   00000001 00000000 00000000 00000000

char* は 1 バイトなので、このアドレスを char* にキャストすると、上記の最初のバイトが取得されます。

   00000000

また

   00000001

したがって、最初のバイトを調べることで、アーキテクチャのエンディアンを判断できます。

于 2012-08-28T14:35:12.600 に答える
4

これは、sizeof(int) > 1. char例として、それが 2 で、aが 8 ビットであると仮定します。

基本的に、リトルエンディアンでは、16 ビット整数としての数値 1 は次のようになります。

00000001 00000000

しかし、ビッグエンディアンでは、次のようになります。

00000000 00000001

したがって、最初にコードが設定a = 1され、次に次のようになります。

*( (char*)&a ) == 1)

のアドレスをa取得し、それを へのポインタとして扱いchar、逆参照します。そう:

  • aリトル エンディアンの整数が含まれている場合は、00000001セクションを取得します。char

  • aビッグエンディアンの整数が含まれている場合は、00000000代わりに取得します。のチェック== 1は失敗し、コードはプラットフォームがビッグエンディアンであると想定します。

int16_tandint8_tの代わりにintandを使用すると、このコードを改善できますchar。またはさらに良いことに、かどうかを確認してくださいhtons(1) != 1

于 2012-08-28T14:36:25.087 に答える
2
  1. の住所を取るa
  2. にキャストするchar*
  3. this を逆参照します。これにより、最初のバイトchar*が得られますint
  4. その値を確認してください - の場合は1、リトルエンディアンです。そうでなければ - 大きい。

とするとsizeof(int) == 4、次のようになります。

|........||........||........||........|    <- 4bytes, 8 bits each for the int a
| byte#1 || byte#2 || byte#3 || byte#4 |

ステップ 1、2、および 3 が実行されると*( (char*)&a )、最初のバイトが得られます| byte#1 |

次に、の値を確認することで、byte#1ビッグ エンディアンかリトル エンディアンかを理解できます。

于 2012-08-28T14:32:29.273 に答える
2
  • 整数を 4 バイトの配列として見ることができます (ほとんどのプラットフォームで)。リトル エンディアンの整数には、値01 00 00 00とビッグ エンディアンが含まれ00 00 00 01ます。
  • そう&aすることで、その配列の最初の要素のアドレスを取得します。
  • この式(char*)&aは、それを 1 バイトのアドレスにキャストします。
  • 最後*( (char*)&a )に、そのアドレスに含まれる値を取得します。
于 2012-08-28T14:37:13.437 に答える
1
a = 00000000 00000000 00000000 00000001
    ^                                 ^
    |                                 |
    &a if big endian                  &a if little endian

    00000000                   00000001
    ^                                 ^
    |                                 |
    (char*)&a for BE                  (char*)&a for LE

    *(char*)&a = 0 for BE             *(char*)&a = 1 for LE
于 2012-08-28T14:38:28.397 に答える
1

分解方法は次のとおりです。

           a        -- given the variable a
          &a        -- take its address; type of the expression is int *
  (char *)&a        -- cast the pointer expression from type int * to type char *
*((char *)&a)       -- dereference the pointer expression
*((char *)&a) == 1  -- and compare it to 1

基本的に、キャスト(char *)&aは式の型をへの&aポインターからintへのポインターに変換しcharます。逆参照演算子を結果に適用すると、 の最初のバイトに格納されている値が得られますa

于 2012-08-28T19:40:30.467 に答える
1

intプログラムは、an が占めるスペースを s の配列として再解釈し、int が一連のバイトとして格納されるcharと想定します。その最下位の順序は値 1 のバイトであり、残りは 0 です。1

したがって、最下位バイトが最初に発生する場合、プラットフォームはリトル エンディアンであり、それ以外の場合はビッグ エンディアンです。

これらの仮定は、存在するすべてのプラットフォームで機能するとは限りません。

于 2012-08-28T14:35:38.350 に答える
0
*( (char*)&a )

int i=1 (サイズ 4 バイト) の BigEndian データは、次のようにメモリ内に配置されます:- (下位アドレスから上位アドレスへ)。

00000000 -->Address 0x100
00000000 -->Address 0x101
00000000 -->Address 0x102
00000001 -->Address 0x103

LittleEndian は:-

00000001 -->Address 0x100
00000000 -->Address 0x101
00000000 -->Address 0x102
00000000 -->Address 0x103

上記のキャストの分析:-

また&a= 0x100
*((char*)0x100)0x100 のデータが参照されるように、1 バイト (int に 4 バイトがロードされるため) を使用することを検討することを意味します。

*( (char*)&a ) == 1 => (*0x100 ==1) that is 1==1 and so true,implying its little endian. 
于 2012-08-28T14:43:41.937 に答える