原创 C语言中的位字段(bit field)

2013-9-17 15:47 2260 13 17 分类: 消费电子

 

C语言中提供了位字段(bit field)的概念,也称为位域。在C中大都是在结构体内使用位域的方法,这种方法可以节约在不需要那么多位的情况下节约内存空间,并且处理起来也很简单。它的声明形式如下:
 
struct 
{
unsigned char bitfield1 : 2;
unsigned char bitfield2 : 4;
unsigned char        : 2;
unsigned char bitfield3 : 3;
unsigned char        : 0;
.....
variable type name   : n;
}
 
这种类型的声明方式在很多ARM内核的MCU头文件中都使用这种方式,因为MCU的控制寄存器用位域的方式处理更加快捷与直观。
 
在位字段的使用过程中有几点需要注意:
 
1.关于位变量的内存占用大小与内存分配。位变量类型只能声明为整形,如char ,int。比如上面的例子而言,field1和field2是共同占用一个unsigned char类型的空间大小的,并不是占用两个unsigned char空间大小,如果连续的几个位变量所占用的空间大小超出了所定义类型的大小编译器会自动的将超过的位字段分配到下一个连续的空间中,但不允许跨界占用,如上面的例子field1和field2会放在同一个unsigned char空间内,但field3占有3个bit,编译器不会把其中的2bit放在和field1,field2同一个字节空间内,而是会直接放到下一个字节空间中,所以在上一个字节空间内也就存在了2bit的空洞,就浪费了。这种情况下是没有方法直接避免浪费的这2个bit的,除非你在其中放入刚好只有2个bit的位变量,不过也可以人为的放入没有位变量名的位变量直接将其跳过,如上。还有就是声明一个0宽度的位变量会直接强制编译器将接下的位变量放入下一个字节中。不同的编译器中位变量在空间的排列也不同,比如MicroSoft Visual C++6.0对位字段在空间上的排列在从右向左,即首先放在最低位。
 
2.关于位变量的赋值问题,位变量是声明在结构体内部的,所以对于它的赋值方式基本上和结构体变量的赋值是相同的,但要注意的是赋值的范围是根据此位变量的位数来定的,比如,field1最大只能赋3,因为超过3了,也就超出的field1的最大位数了。位变量主要用于那此选择情况较少的,比如是与否等等,因为这样的话你就没必要去专门声明一个变量去表示了,大大的节约的内存占有率,同样也直观。在补充一点关于C中字节对齐的原则:
 

1:数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小或者成员的子成员大小(只要该成员有子成员,比如说是数组,结构体等)的整数倍开始(比如int在32位机为4字节,则要从4的整数倍地址开始存储。


2:结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储.(struct a里存有struct b,b里有char,int ,double等元素,那b应该从8的整数倍开始存储.)


3:收尾工作:结构体的总大小,也就是sizeof的结果,.必须是其内部最大成员的整数倍.不足的要补齐.

 

文章评论4条评论)

登录后参与讨论

644398774_263592779 2013-10-12 01:01

小小学习下,赞一个

huhaomcu_856934054 2013-9-29 09:01

小编为什么总是插图插不进去咧!

用户1602177 2013-9-17 16:10

推荐~

allen_zhan_752827529 2013-9-15 21:08

所以我个人建议, 自行完成 access member 函数, 这将在效率和 size 上得到相当大的提升.

用户516996 2013-1-5 10:23

讲的很好。过程、好习惯的养成至关重要。
相关推荐阅读
huhaomcu_856934054 2014-08-19 20:54
uCOS-Ⅱ
启动uCOS-Ⅱ的学习与移植!...
huhaomcu_856934054 2014-07-20 10:08
多通道电路原理图
简单说说关于Protel中提供的多通道原理绘制与PCB布局布线. Protel(不知99SE是否可以)有提供多通道电路原理图的设计,这项功能在有些方面还是很有用处的,比如说:当部分原理图在一张图...
huhaomcu_856934054 2014-04-07 09:10
IAR制作工程模板
我个人学习新的MCU过程一般会是如下过程,建立一个个的DEMO工程,每个DEMO工程学习一个外设,所以每个DEMO程序都很简单,但是在建立一个个DEMO程序的过程中,会发现开始的步骤基本上就是相同...
huhaomcu_856934054 2014-03-14 18:06
新公司与老公司的比较
在新公司上了几天班真心有点想念以前的老公司了! 下面来比较比较新公司与老公司吧: 1.业务量。新公司的项目更多,人员更多,涉及的面也较广,整体的技术水平要大大强于以前的老公司。以前老公司里...
huhaomcu_856934054 2014-02-24 15:01
辞职了!
辞职了,但愿柳暗花明又一村!!...
huhaomcu_856934054 2014-02-21 09:22
回来啦!
之前因为身体原因一直在家休息,直到今天才来武汉上班。但愿今年个人的工作能有所上升!...
我要评论
4
13
关闭 站长推荐上一条 /2 下一条