位字段

       位字段对我来说,一直是个陌生的概念,因为平时不经常用到。但是并不是因为它没有实用价值,而是我平时只编编小程序而已。但是它却是个经常被考到的概念。可能就因为它很实用又很迷惑吧!所以,我现在想把它作个总结,但是可能也不全面。还有它经常与sizeof()一起被涉及到,但我发现我的帖子总是贴很长,使人看了就要畏惧心理,所以我想分开总结一下这两个概念。     

下面先总结下“位字段”的几个概念:

      定义:位字段简称字段,是“字”中相邻位的集合;所谓“字”是由实现定义的单一存储单元。字段定义和访问的语法基于结构。

      位字段所允许的类型:C语言允许unsigned int类型,signed int类型或int类型的位字段,分别称为无符号字段,带符号字段和普通位字段。和普通字符一样,普通位字段可以无符号或带符号。C99允许_Bool类型的位字段。

      应用:位段结构也是一种结构体类型,只不过其中含有以位为单位定义存储长度的整数类型位段成员。采用位段结构既节省存储空间,又可方便操作。

    定义格式:unsigned <成员名>:<二进制位数>

    例如:
    struct bytedata
   {
         unsigned a:2;   /*位段a,占2位*/
         unsigned:6;     /*无名位段,占6位,但不能访问*/
         unsigned:0;     /*无名位段,占0位,表下一位段从下一字边界开始*/
         unsigned b:10; /*位段b,占10位*/
         int i;               /*成员i,从下一字边界开始*/
    } data;
     位段数据的引用:
     同结构体成员中的数据引用一样,但应注意位段的最大取值范围不要超出二进制位数定的范围,否则超出部分会丢弃。
     例如:data.a=2;   但 data.a=10;就超出范围(a占2位,最大3)


注意:
(1)一个位段必须存储在同一存储单元(即字)之中,不能跨两个单元。如果其单元空间不够,则剩余空间不用,从下一个单元起存放该位段。
(2)可以通过定义长度为0的位段的方式使下一位段从下一存储单元开始。
(3)可以定义无名位段。
(4)位段的长度不能大于存储单元的长度。
(5)位段无地址,不能对位段进行取地址运算。
(6)位段可以以%d,%o,%x格式输出。
(7)位段若出现在表达式中,将被系统自动转换成整数。

以上文献最后两段是转载网上的,特此声明。这篇文章其实并没有写完整位字段,但是目前我也没想出什么,等以后想到再加以补充吧!

转载于:https://www.cnblogs.com/xiaoliyu/archive/2008/11/18/1335711.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值