位字段

1.概念

位字段是“字”中相邻位的集合,是C语言中一种存储结构,不同于一般结构体的是它在定义成员的时候需要指定成员所占的位数。一般使用在储存空间很宝贵的情况下,有可能需要将多个对象保存在一个机器字节中。这时候就可以用到位字段。

2.用法

2.1常规用法

struct{
unsigned int is_keyword : 1;
unsigned int is_extern  : 1;
unsigned int is_static  : 1;
} flag;

这里定义了一个变量flag,它包含3个一位的字段。冒号后的数字表示字段的宽度(用二进制位数表示),字段被声明为unsigned int 类型,以保证他们是无符号量。
单个字段的引用方式和其他结构体成员相同。同其他整数一样,字段可以出现在算术表达式中。上面的例子可以用更自然的方式表达为:

flag.is_keyword = flag.is_extern = 1;

该语句将is_keyword和is_extern置一。

2.2占用空间

2.2.1

struct{
unsigned int a : 5;
unsigned int b : 3;
unsigned int c : 20;
unsigned int d : 4;
} flag_1;

其中成员a占用5位,成员b占用3位,成员c占用20位,成员d占用4位,结构体flag占,32位,4个字节。
2.2.2

struct{
unsigned int a : 5;
unsigned int b : 3;
unsigned int c : 20;
unsigned int d : 0;
} flag_2;

特殊宽度0可以用来强制在下一个字边界上对齐,接口体flag占用的空间为5+3+20=28,强制对齐28+4=32(刚好4个字节),flag_1的占用空间等于flag_2。

3.位字段带来的问题

字段对维护内部定义的数据结构很有用,但是考虑到字节存放的大端小端的问题,使用位字段定义的数据不能在不同字节顺序的机器之间移动。因此,从理论上来说,使用位字段的程序是不可移植的。
字段不是数组,并且没有地址,因此不能对它们使用&运算符。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值