自定义类型(位段/位域)

目录

什么是位段

位段的内存分配

位段的跨平台问题

位段的应用


什么是位段

位段的声明与结构体类似,但是有些不同

1.位段的成员必须是 int、unsigned int 或signed int (属于整型家族即可)
2.位段的成员名后边有一个冒号和一个数字

3.位段不允许取地址

4.位域的位数不能大于字段类型的位数

5.位段的长度不能为0

位段的内存分配

1. 位段的成员可以是 int unsigned int signed int 或者是 char (属于整形家族)类型
2. 位段的空间上是按照需要以4个字节( int )或者1个字节( char )的方式来开辟的
3. 位段涉及很多不确定因素,位段是不跨平台的,注重可移植的程序应该避免使用位段

一个char是8个比特位,由图可知,位段a=3,就是分配3个二进制位给到a,一样的;位段b=4,就是分配4个二进制位给到b;位段c=5,就是分配5个二进制位给到c;位段d=4,就是分配4个二进制位给到d

计算机4个比特位4个比特位读取的内存数据也和图中吻合

所以vs环境里位段是按照需要以4个字节( int )或者1个字节( char )的方式来开辟的,然后分配给各个元素,如果空间不足,则浪费掉剩余空间继续开辟空间分配

但是,并不是所有环境都是这样的(位段的具体行为在C标准中没有明确定义,因此取决于编译器的实现),这是位段不能跨平台使用的原因之一

位段的跨平台问题

1. int 位段被当成有符号数还是无符号数是不确定的
2. 位段中最大位的数目不能确定。(16位机器最大16,32位机器最大32,写成27,在16位机
器会出问题
3. 位段中的成员在内存中从左向右分配,还是从右向左分配标准尚未定义
4. 当一个结构包含两个位段,第二个位段成员比较大,无法容纳于第一个位段剩余的位时,是
舍弃剩余的位还是利用,这是不确定的
总结:
跟结构相比,位段可以达到同样的效果,但是可以很好的节省空间,但是有跨平台的问题存在

位段的应用

  1. 位操作:位段可以方便地进行位操作,如设置、清除和读取特定位的值
  2. 处理硬件寄存器:位段常用于处理和访问硬件设备的寄存器,其中每个位表示不同的硬件状态或配置
  3. 压缩数据:位段可以将多个数据字段压缩成一个整数,从而节省内存空间

最后,祝各位道友早日突破/进阶

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值