c语言_联合问题

//在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;

欢迎指正!

猜你喜欢

转载自blog.csdn.net/yanxu_165319/article/details/81943234