//在32位x86系统下
int main()
{
union {
int k;
char i[2];
} *s,a;
s = &a;
s->i[0] = 0x39;
s->i[1] = 0x38;
printf("%d",a.k);
//输出结果为3839
return 0;
}
运用知识:联合,大端小端,数据在内存中的存储方式
联合:多个变量共享一段内存,分配内存时以占用内存最大的变量分配内存
大端小端:大端:数据的高字节保存在内存的低地址中,小端:数据的高字节保存在内存的高地址中。
c语言中,默认是小端。
x86是小端模式。
数据在内存中的存储方式:数据都是由低地址向高地址存放
下面以unsigned int value = 0x12345678为例,分别看看在两种字节序下其存储情况,我们可以用unsigned char buf[4]来表示value
Big-Endian: 低地址存放高位,如下:
高地址
---------------
buf[3] (0x78) -- 低位
buf[2] (0x56)
buf[1] (0x34)
buf[0] (0x12) -- 高位
---------------
低地址
Little-Endian: 低地址存放低位,如下:
高地址
---------------
buf[3] (0x12) -- 高位
buf[2] (0x34)
buf[1] (0x56)
buf[0] (0x78) -- 低位
--------------
低地址
综上:代码中联合共占用4byte,小端模式,低字节存放在低地址中
高地址
------------
0x00 --高位
0x00
i[1] 0x38
i[0] 0x39 --低位
------------
低地址
所以最后输出为 00003839;
欢迎指正!