1.什么是位段?
位段,C语言允许在一个结构体中以位为单位来指定其成员所占内存长度,这种以位为单位的成员称为“位段”或被称为"位域"。利用位段能够用较少的位数存储数据。
2.优点、缺点、缺陷与不足:
优点:(1).可以使数据单元节省存储空间。
(2).方便访问一个整数内容部分内容从而简化程序源代码。
缺点:其内存分配与内存对齐的实现方式依赖于具体的机器和系统,在不同的平台可能有不同的结果,这导致了位段在本质上是不可以移植的。
缺陷与不足:
(1).int 位段被当成有符号数还是无符号数是不确定的。
(2).位段中最大数目不能确定。(16位机器最大16,32位机器最大32,写成27,在16位机器上会有问题)
(3).位段中的成员在内存中是从左向右分配,还是从右向左分配的标准尚未定义。
(4).当一个结构体包含两个位段,第二个位段成员比较大时,无法容纳于第一个位段剩余的位,剩余的位是舍弃还是利用时,还是不确定的。
3.类型:
位段成员类型必须指定为整形类型。整形家族【unsigned int , signed int ,char 】 。
4. 位段的使用方法:
变量类型+变量名+: +分配的比特位
5.注意:
1.位段的空间上是按照需要以4个字节(int)或者1个字节(char)的方式来开辟的。
2.位段成员们类型一般是整形类型的,很少在同一个结构体中很少出现不同的成员类型,比如(float、double,long)
6.例子:
#include <stdio.h>
struct S
{
char a:3;
char b:4;
char c:5;
char d:4;
};
int main()
{
struct S s={0};
s.a=10;
s.b=12;
s.c=3;
s.d=4;
printf("%d\n",sizeof(struct S));
return 0;
}
1.根据注意中的第一条规则: 位段的空间上是按照需要以4个字节(int)或者1个字节(char)的方式来开辟的。我们看以下的结构体:
在visual stdio 2019平台上,那么结构体sturct S的大小是不是3个字节呢?
那么,在visual studio 2019平台上,上述开辟一个1字节空间,容纳第一个成员a,剩余的比特位容纳不得下一个成员时,剩余的比特位是被弃用的,则需要重新开辟一个1字节空间。
2.结构体Struct s开辟了三个字节空间那么他们是怎样存储数据的呢?
假定它们是从右向左分配的。
接下来进行存储数据:
内存上是:
那么结构体struct S 的变量s,它的内存分配是不是 620304呢?
从上图可知, 证明在visual studio 2019的平台上,位段成员在内存上是从右向左分配的。
在我们看来,结构体和位段 相似,能够节省空间,但是位段存在缺陷和不足,可以返回上文看看位段的缺陷和不足的介绍吧。
位段的练习题目:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main()
{
unsigned char puc[4];
struct tagPIM
{
unsigned char ucPim1;
unsigned char ucData0 : 1;
unsigned char ucData1 : 2;
unsigned char ucData2 : 3;
}*pstPimData;
pstPimData = (struct tagPIM*)puc;
memset(puc, 0, 4);
pstPimData->ucPim1 = 2;
pstPimData->ucData0 = 3;
pstPimData->ucData1 = 4;
pstPimData->ucData2 = 5;
printf("%02x %02x %02x %02x\n", puc[0], puc[1], puc[2], puc[3]);
return 0;
}
题目解析:
那么打印的值为puc[0]=02,puc[1]=29;puc[2]=00;puc[3]=00;
揭晓答案: