1

そのため、コードを使用して、システムが使用しているエンディアンを調べようとしています。私はネットを見て、同じ質問をしている人を見つけました.Stack Exchangeの回答の1つに次のコードがありました:

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

しかし、その人はなぜこれが機能するのかを説明しておらず、私は尋ねることができませんでした. 次のコードの背後にある理由は何ですか?

(*(char *)&num == 1)
4

4 に答える 4

4

C/C++を使用していると思います

  1. &numinteger のメモリ内のアドレスを取得しますnum
  2. charキャストにより、 そのアドレスを a へのポインターとして解釈します。(char *)
  3. 次に、char へのこのポインタの値が最初のアスタリスクによって考慮され、1*(char *)&numと比較されます。

現在intは 4 バイトです。これは00 00 00 01、ビッグ エンディアン システムとリトル エンディアン システム01 00 00 00上にあります。char は 1 バイトしかないため、char へのキャストの値は、によって占有されているメモリの最初のバイトになりますnum。したがって、ビッグ エンディアン システムではこれは になり**00** 00 00 01、リトル エンディアン システムでは になります**01** 00 00 00。ここで、if ステートメントを使用して比較を行い、char にキャストされた int がリトル エンディアン システムで使用されるバイトの順序と等しいかどうかを調べます。

X86 32 ビット システムでは、これは次のアセンブリにコンパイルできます。

mov     [esp+20h+var_4], 1      ; Moves the value of 1 to a memory address
lea     eax, [esp+20h+var_4]    ; Loads that memory address to eax register
mov     al, [eax]               ; Takes the first byte of the value pointed to by the eax register and move that to register al (al is 1 byte)
cmp     al, 1                   ; compares that one byte of register al to the value of 1
于 2013-10-09T05:07:25.027 に答える
0
(*(char *)&num == 1)

大雑把に訳すと、変数のアドレスを取得しますnum。その内容を文字にキャストし、値を 1 と比較します。

整数の最初のアドレスの文字が 1 の場合、それは下位バイトであり、数値はリトルエンディアンです。

ビッグ エンディアンの数値では、最下位アドレスに上位バイト (整数値が 1 の場合は 0) があるため、比較は失敗します。

于 2013-10-09T05:03:00.760 に答える
0

「int」型は 4 バイト、「char」型は 1 バイトしかないことは誰もが知っています。その行は単に整数を char に変換するだけです。これは char c = (char)"num の最下位バイト" と同等です。

エンディアンの概念を参照してください: http://en.wikipedia.org/wiki/Endianness

ホスト マシンがビッグ エンディアンの場合、c の値は 0 になり、それ以外の場合は 1 になります。

例: num が 0x12345678 であると仮定すると、ビッグ エンディアン マシンでは c は 0x12 になり、リトル エンディアン マシンでは c は 0x78 になります。

于 2013-10-09T05:04:48.633 に答える
0

ここに行きます。値 1 を 4 バイトの int に割り当てるので、

リトルエンディアン x86 では 01 00 00 00 ビッグエンディアンでは 00 00 00 01

(*(文字 *)&数値 == 1)

&num は int のアドレスを示しますが、char* へのキャストは読み取り (逆参照) を 1 バイト (char のサイズ) に制限します

最初のバイトが 1 の場合、最下位ビットが最初になり、リトル エンディアンになります。

于 2013-10-09T05:13:58.463 に答える