在研究 union的时候遇到一个题目,是关于大小端的问题,从而牵扯出了探索内存地址的问题
#include <stdio.h>
static union {
int i;
char a[2];
} abc;
int main() {
abc.a[0] = 10; // 低
abc.a[1] = 1; //高
printf("%d\n", abc.i); //266 10a
return 0;
}
一般机器为小端,所以当小端的时候这里的结果为266.
为什么那?
首先这里是union共用体,所以大小为 sizeof(int).
比如地址有4个编号,1,2,3,4 分别表示低->高, 由于这里是小端,所以1->10(a),2->1(1),3->0(0),4->0(0) 括号内的为16进制
整体则为: 0x0000010a
自己也就是在 0x0000010a
上面迷糊,为什么不是0x1a
那?
这里如果要是知道16进制每两位为一个字节, 就很简单了.比如说上面4个编号,正好对应那4字节空间,每个字节空间依次对应0x0000010a
中的2位,也就是第一个字节对应0a
,第二个字节对应01
,依次类推.
探索
为什么内存地址中的16进制最小单位是1bit,1Byte?
通过gdb调试可以看到以下结果:
0x601038 00000000 00000010 00000001 00001010
0x601039 00000000 00000000 00000010 00