目录
- 开头
- 1.什么是位段?
- 2.位段的优缺点
- 优点
- 缺点
- 3.位段的实际应用
- ……
- 结尾
开头
大家好,我叫这是我58。在今天,我们将要介绍一个既比char
类型小,又只用于结构体的一种东西——位段。
1.什么是位段?
位段,就是一种比char
类型小的变量,当然,你也可以说位段比long long
类型小,但是,位段只能用于结构体,那如何在结构体里创建一个位段呢?其实,这就是位段的创建方法:
从这张图中,我们可以知道char
是位段的类型,a
是位段的名称,:
是位段的创建不可缺少的内容,而最右边的5
则是位段的大小:5bit
,其中,位段的类型既可以是刚才提到的char
类型,也可以是整型家族中的short
,int
,long
,long long
,signed int
,unsigned int
等等类型,而位段的名称随便取,至于位段的大小,如果位段的类型为char
,那么位段的大小就不应该大于8
个bit
,否则就会报错,因为1byte == 8bit
,9
个bit
不能塞到8
个bit
里去,同理,如果位段的类型为int
,那么位段的大小就不应该大于32
个bit
,否则就也会报错,因为int == 4byte == 8bit
,35
个bit
不能塞到32
个bit
里去,当然,任何位段的大小都不能等于0
,因为没有申请空间的位段不能使用,并且,任何位段的大小也不能小于0
,因为内存永远不是负数。那位段是怎么存储在结构体的呢?其实可以看一下下面的例子:
在这例子中(以VS
为主,其他尚不确定),位段a
开辟了一块int
类型的大小的内存,占了int
类型的3
个bit
,位段b
占了这个内存的5
个bit
,位段c
占了这个内存的10
个bit
,位段b
的30
个bit
则因为这个内存现在没有地方占了,则又开辟了一块int
类型的大小的内存,并占了这个内存的30
个bit
,而位段是怎么赋值的呢?从下面的例子就可以看出来:
从这之中,我们可以看到位段int a:3
和位段int b:5
在赋值的时候发生了截断,而位段int c:10
和位段int d:30
的后面再赋值好之后还有很多的0
呢。并且,我还给出了这两段内存的十六进制:B6E00000
和A3000000
,这两段内存的十六进制真的是这样的吗?我们调试一下,看!还真是这样:。在看到这里之后,我们就基本的讲完了位段的介绍了,接下来,就要讲一下位段的优缺点了。
2.位段的优缺点
1
优点
- 节省空间
缺点
- 位段不跨平台
- 位段涉及很多不确定因素
- 类型为
int
的位段被当成有符号数还是无符号数是不确定的 - 位段中最大位的数目不能确定(16位机器最大
16
, 32位机器最大32
,写成27
,在16位机器就会出问题) - 位段中的成员在内存中从左向右分配,还是从右向左分配标准尚未定义
- 当一个结构包含两个位段,第二个位段成员比较大,无法容纳于第一个位段剩余的位时,是 舍弃剩余的位还是利用,这是不确定的
- 类型为
3.位段的实际应用
1
……
结尾
总的来说,位段可以在结构体中节省空间,但是位段也具有不跨平台,涉及很多不确定因素这两个不良的特点,因此,注重可移植的程序应该避免使用位段。1
选自薄荷冰ovo的博客——《5分钟带你了解位段》 ↩︎ ↩︎ ↩︎