比char类型小的变量——位段

开头

大家好,我叫这是我58。在今天,我们将要介绍一个既比char类型小,又只用于结构体的一种东西——位段。

1.什么是位段?

位段,就是一种比char类型小的变量,当然,你也可以说位段比long long类型小,但是,位段只能用于结构体,那如何在结构体里创建一个位段呢?其实,这就是位段的创建方法:

从这张图中,我们可以知道char是位段的类型,a是位段的名称,:是位段的创建不可缺少的内容,而最右边的5则是位段的大小:5bit,其中,位段的类型既可以是刚才提到的char类型,也可以是整型家族中的shortintlonglong longsigned intunsigned int等等类型,而位段的名称随便取,至于位段的大小,如果位段的类型为char,那么位段的大小就不应该大于8bit,否则就会报错,因为1byte == 8bit9bit不能塞到8bit里去,同理,如果位段的类型为int,那么位段的大小就不应该大于32bit,否则就也会报错,因为int == 4byte == 8bit35bit不能塞到32bit里去,当然,任何位段的大小都不能等于0,因为没有申请空间的位段不能使用,并且,任何位段的大小也不能小于0,因为内存永远不是负数。那位段是怎么存储在结构体的呢?其实可以看一下下面的例子:

在这例子中(以VS为主,其他尚不确定),位段a开辟了一块int类型的大小的内存,占了int类型的3bit,位段b占了这个内存的5bit,位段c占了这个内存的10bit,位段b30bit则因为这个内存现在没有地方占了,则又开辟了一块int类型的大小的内存,并占了这个内存的30bit,而位段是怎么赋值的呢?从下面的例子就可以看出来:

从这之中,我们可以看到位段int a:3和位段int b:5在赋值的时候发生了截断,而位段int c:10和位段int d:30的后面再赋值好之后还有很多的0呢。并且,我还给出了这两段内存的十六进制:B6E00000A3000000,这两段内存的十六进制真的是这样的吗?我们调试一下,看!还真是这样:。在看到这里之后,我们就基本的讲完了位段的介绍了,接下来,就要讲一下位段的优缺点了。

2.位段的优缺点

1

优点

  • 节省空间

缺点

  • 位段不跨平台
  • 位段涉及很多不确定因素
    • 类型为int的位段被当成有符号数还是无符号数是不确定的
    • 位段中最大位的数目不能确定(16位机器最大16 , 32位机器最大32 ,写成27,在16位机器就会出问题)
    • 位段中的成员在内存中从左向右分配,还是从右向左分配标准尚未定义
    • 当一个结构包含两个位段,第二个位段成员比较大,无法容纳于第一个位段剩余的位时,是 舍弃剩余的位还是利用,这是不确定的

3.位段的实际应用

1

……

结尾

总的来说,位段可以在结构体中节省空间,但是位段也具有不跨平台涉及很多不确定因素这两个不良的特点,因此,注重可移植的程序应该避免使用位段。1


  1. 选自薄荷冰ovo的博客——《5分钟带你了解位段》 ↩︎ ↩︎ ↩︎

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值