Lea*_*ner 11 c arrays int pointers char
#include <stdio.h>
int main(){
unsigned char a[4] = {1, 2, 3, 4};
int b = *(int *)&a[0];
printf("%d\n", b);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我只是不明白,为什么结果b是0x4030201.
有人可以帮帮我吗?
Tug*_*tes 13
当你告诉编译器创建一个这样的数组时:
unsigned char a[4] = {1, 2, 3, 4};
Run Code Online (Sandbox Code Playgroud)
这些数字按以下顺序放在内存中:
MemoryAddress0: 0x01 -> a[0]
MemoryAddress1: 0x02 -> a[1]
MemoryAddress2: 0x03 -> a[2]
MemoryAddress3: 0x04 -> a[3]
Run Code Online (Sandbox Code Playgroud)
&a[0]是一个char值为的指针,MemoryAddress0并指向1个字节的值0x01
(int*)&a[0]是一个具有相同值MemoryAddress0但具有int*此次类型的转换指针,因此它指向四个连续的字节.
我们日常生活中使用的大多数机器都是小端,这意味着它们在内存中存储多字节值,从最低有效字节到最重要字节.
当int*指向四个字节的存储器时,它遇到的第一个字节是最低有效字节,第二个字节是第二个最低有效字节,依此类推.
MemoryAddress0: 0x01 -> 2^0 term
MemoryAddress1: 0x02 -> 2^8 term
MemoryAddress2: 0x03 -> 2^16 term
MemoryAddress3: 0x04 -> 2^24 term
Run Code Online (Sandbox Code Playgroud)
因此,4字节的整数值变为0x01*2^0 + 0x02*2^8 + 0x03*2^16 + 0x04*2^24等于0x04030201.
您使用的是小端机器,这意味着大小大于一个字节的整数首先存储最不重要的字节.
请注意,由于x86的共性,目前大多数架构都是小端的.
| 归档时间: |
|
| 查看次数: |
10947 次 |
| 最近记录: |