12
#include <stdio.h>

int main(){
    unsigned char a[4] = {1, 2, 3, 4};
    int b = *(int *)&a[0];

    printf("%d\n", b);
    return 0;
}

bの結果が である理由がわかりません0x4030201

誰か助けてくれませんか?

4

3 に答える 3

15

次のような配列を作成するようにコンパイラに指示すると:

unsigned char a[4] = {1, 2, 3, 4};

これらの数値は、次の順序でメモリのどこかに配置されます。

MemoryAddress0: 0x01 -> a[0]
MemoryAddress1: 0x02 -> a[1]
MemoryAddress2: 0x03 -> a[2]
MemoryAddress3: 0x04 -> a[3]

&a[0]の値を持つcharポインタでありMemoryAddress0、 の 1 バイト値を指します0x01

(int*)&a[0]は同じ値のキャストされたポインターですMemoryAddress0が、int*今回は型を使用するため、連続する 4 バイトを指します。

私たちが日常生活で使用するほとんどのマシンはリトル エンディアンです。つまり、最下位バイトから最上位バイトまでのマルチバイト値をメモリに格納します。

が 4 バイトのメモリを指している場合、int*遭遇する最初のバイトは最下位バイトであり、2 番目のバイトは 2 番目に下位のバイトであり、以下同様です。

MemoryAddress0: 0x01 -> 2^0 term
MemoryAddress1: 0x02 -> 2^8 term
MemoryAddress2: 0x03 -> 2^16 term
MemoryAddress3: 0x04 -> 2^24 term

したがって、4 バイトの整数値は次のようになり0x01*2^0 + 0x02*2^8 + 0x03*2^16 + 0x04*2^24ます0x04030201

于 2012-09-08T09:28:23.547 に答える
6

リトルエンディアンのマシンを使用している場合、これは、バイトより大きいサイズの整数が最下位バイトを最初に格納することを意味します。

最近のほとんどのアーキテクチャは、x86の共通性のおかげで、リトルエンディアンであることに注意してください。

于 2012-09-08T09:14:29.453 に答える
1

システムがリトルエンディアンだからです。マルチバイト整数の最初のバイトは、リトルエンディアンシステムでは最下位バイトとして解釈されます。

于 2012-09-08T09:14:20.007 に答える