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;

 

欢迎指正!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值