位段(详解)

简介: 位段又叫做位域,具体是一种可以把数据以位的形式紧凑的存储,并允许程序员对此结构位进行操作的数据结构。

1.什么是位段

位段又叫做位域,具体是一种可以把数据以位的形式紧凑的存储,并允许程序员对此结构位进行操作的数据结构。


位段的声明和结构是类似的,但该在一定程度上节省了空间,有两个不同:


1.位段的成员必须是 int、unsigned int 或signed int 。


2.位段的成员名后边有一个冒号和一个数字(数字大小不能超过对于类型大小)

image.png




这里表示,变量a只占两个比特位,变量b表示占5个比特位,变量c表示占10个比特位,变量d表示占30个比特位


2.位段的内存分配

1. 位段的成员可以是 int unsigned int signed int 或者是 char (属于整形家族)类型


2. 位段的空间上是按照需要以4个字节( int )或者1个字节( char )的方式来开辟的。(根据对应类型每次开辟4个或一个字节,当被开辟的字节空间被使用结束后,再开辟一或4个字节)


3. 位段涉及很多不确定因素,位段是不跨平台的,注重可移植的程序应该避免使用位段。


对于每个数据的具体存储在不同编译器下得到的结果是不一样的,下面是VS2013给的数据,大家可以参考参考

image.png



3.位段跨平台问题

1. int 位段被当成有符号数还是无符号数是不确定的。


2. 位段中最大位的数目不能确定。(16位机器最大16,32位机器最大32,写成27,在16位机


器会出问题。


3. 位段中的成员在内存中从左向右分配,还是从右向左分配标准尚未定义。


4. 当一个结构包含两个位段,第二个位段成员比较大,无法容纳于第一个位段剩余的位时,是


舍弃剩余的位还是利用,这是不确定的


由于位段的这些缺点,在使用位段前,大家需要考虑未来代码是否需要移植,来决定是否使用位段。


位段经常适用于IP地址的拆解中,以减少结构体占用空间较大该网络带来压力


image.png

相关文章
|
存储 程序员 C语言
结构体,联合体与位段
结构体,联合体与位段
65 0
|
6月前
|
编译器 C语言 C++
C语言学习记录——位段(内存分配、位段的跨平台、位段的应用)
C语言学习记录——位段(内存分配、位段的跨平台、位段的应用)
63 0
|
7月前
|
存储 网络协议 编译器
c位域
c位域
70 0
|
7月前
|
存储 数据安全/隐私保护 C语言
位域
位域
53 0
|
7月前
位域的使用
位域的使用。
38 1
|
7月前
|
存储
联合体和结构体对齐
联合体和结构体对齐
|
7月前
|
存储 编译器 C语言
自定义类型:结构体(自引用、内存对齐、位段(位域))
自定义类型:结构体(自引用、内存对齐、位段(位域))
|
7月前
|
存储 编译器 C语言
结构体的内存对齐与位段
当我们描述一个人的年龄时我们可以使用,int age = 18;但是如果我们要描述一个人呢?很显然我们无法仅靠一个age就实现对一个人的描述,所以就有了结构体,在结构体中我们可以包含多种类型的数据,这样就可以实现对一个人的描述比如身高、爱好、体重等等
|
存储 编译器 C语言
结构体对齐+联合体+位段
结构体对齐+联合体+位段
114 1
结构体位段问题
什么是位段 位段的详细解释 位段其实也是一种结构体的类型 1.位段的成员是 int ,short int unsigned int , signed int , short , char 类型 2.位段的成员名后有一个冒号和一个数字 看一个例子: