#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
。
誰か助けてくれませんか?
次のような配列を作成するようにコンパイラに指示すると:
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
。
リトルエンディアンのマシンを使用している場合、これは、バイトより大きいサイズの整数が最下位バイトを最初に格納することを意味します。
最近のほとんどのアーキテクチャは、x86の共通性のおかげで、リトルエンディアンであることに注意してください。
システムがリトルエンディアンだからです。マルチバイト整数の最初のバイトは、リトルエンディアンシステムでは最下位バイトとして解釈されます。