C语言位段

一、位段的定义(位指二进制位)
位段的定义方式与结构体基本一致,但是里面的成员变量只能使用int, unsigned int 和signed int(char类型也可以),可以指定每个成员的二进制位数,从而实现空间的节省
定义语法

 struct bitF
 {
         int a : 20;
         int b : 10;
         int c : 32;
         int d : 1;
 };       //与结构体相同,只是成员变量后面用:指定了分配该成员的二进制位数,如果给出的值超出了位数,则保留低位的值,高位值丢弃,如果给出的值比位数小,则地位保留,高位补零

二、位段的空间分配
首先开辟一个变量类型的大小,比如int型,先分配32位,然后把这32位给每一位成员进行分配(内存空间从右向左分配),当剩余的空间数 < 该成员的位数时,再开辟一个变量类型的大小,继续给后面的成员分配,依次类推(位数只二进制位)
例:

   struct bitC
 {
         char a : 3;
         char b : 4;
         char c : 8;
         char d : 2;
 };
 struct bitC bc = { 10, 16, 215, 7 };

创建了一个位段变量bc,初始化位{ 10, 16, 215, 7}
首先开辟一个char类型的大小(一个字节),也就是8个bit 位,将10的二进制位(1010)按照从右向左的顺序存入,由于a只有3个bit位,所以存进去的值为010,第一位的1被舍弃。存入后第一个比特位的二进制为:00000 010 (从右向左数010三位分配给a),a存进去之后,还剩5个bit位,此时存入b的值16(二进制位位10000),b有4个bit位,剩余5>4,所以不用新开辟空间,直接存入(10000),值有5位,大小为4位,所以只能从右向左存入4位(0000),第一位的1舍弃。存入后第一个字节的内容位:0 0000 010,第一个bit位浪费,没有存入数据,第二个bit位存储的是16舍弃最高位1的值(0000)。然后存入c的值,此时只剩一个bit位,而c需要8个bit位,所以需要重新开辟空间,这里有开辟一个字节,8个bit位,正好全部分给c,此时赋予c的值位215(11010111)。然后存入d,此时已无剩余空间,所以需要重新开辟空间,这里又开辟一个字节,将最右侧的两个bit位分配给d,存入d的值7(0111),d只有2个bit位的空间,从右向左存入11,高位的01舍弃。最后,整个变量的空间为3个字节,每个字节里面存放的内容为(0000 0010)(11010111)(00000011);内存中显示为02 d7 03(16进制)

三、位段的特性
由于C语言的标准没有给出清晰的定义,所以位段的跨平台使用容易出问题,需要跨平台使用时需要谨慎使用或者避免使用
位段的主要功能是优化空间的分配和使用,在数据传输时,根据需求可以使用位段进行空间的优化,从而加快传输效率

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值