UNION和位域的使用

以下讲解都是在VS2012中进行试验的:

联合体和位域的使用都是以节省空间为目的。

联合体同stuct一样,联合默认方位权限也是共有的,并且,也具有成员函数。

共用体和结构体有以下区别:

1.共用体内存=MAX(各变量)

2.结构的内存=sizeof(各变量之和)+内存对齐

刚接触的union的人,大概只能记住“所有的公用体成员公用一个空间,并且同一时间只能存储其中一个成员变量的值”。这个就是Union的精髓之处。

比如:

简单联合的使用:

当我们在结构体中需要使用两个或者更多我们互斥的变量的时候,我们就可以将这些变量声明为一个联合体变量:

union {

int k;    //吃饭了

int m;    //吃晚饭了

int c;     //吃早饭了

........

}un;

If(吃饭了)

{

    我们出去溜达

}

这样我们就可以使用一个整型的空间来表示if中的条件,并且if条件中的表达是长度更短。

这种方式就会使我们的程序占用更少的空间发挥更大的作用。(四两拨千斤)并且提高了程序的可读性。

 

联合体和位运算联合起来一起使用:

union {

Struct {

unsigned char s1:3;

unsigned char s2:3;

unsigned char s3:2;

}infor;

unsigned char u;

}k;

当u=0x53的时候,s1,s2,s3等于多少?在不断的实验测试下,我得出了一下。

联合体k占有一个字节的空间。数据在内存中的分配情况如下表:(从左向右看)。u 的值为(01010011)0x53。

在内存中,一个地址指向一个字节的空间:

 

1

1

0

0

1

0

1

0

 

当我们将(01010011)0x53放入内存中的时候,我们先放高位的再放低位的顺序依次是:

(内存中从右向左放)01010011。(汇编中有句话是:数据中的高位放在内存中高位上,数据中的低位存放在内存中的低位上)

在进行位分配的时候:s1指向的是左侧的三个位置(110),s2指向随后的三个位置(010),s3指向的是最后两个位置(10)。

读取数据的时候,将顺序颠倒:s1=011 s2=010 s3=01

总结:我们可以看到:s1对应的是u的低三位,s2对应的是中间三位,s3对应的是高两位。当联合体的空间大于一个字节的时候,我们也可以依据这个结论。

联合体的强转:

union{

  Unsigned int n;

   Char c;

}u;

u.n=0x30;

Printf(“%c”,c);

输出的 这样我们就可以实现数据的强制转换。在这里只是告诉你union可以实现数据类型的强制转换。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值