背景
感谢序礼提供的C语言位域的相关信息。看着位域才记起来大学时候学习C语言的时候讲过这玩意儿,老师还出结构体、结构体和联合体混合所占用空间的大小的题目给我们,挖各种坑让我们跳,然后自然而然的就跳进去了,老师是领路人,特意挖坑给你跳,你还逃得过?好吧,其实还是学习的时候不够认真,哈哈。一直就是蒙着头干,突然才意识到,许多以前认为太复杂而当时没有实力去深究的东西现在应该去好好研究一番了。本篇就C语言位域做个简要说明。
正文
在下位机里面,会经常出现标识位,这东西占用1个字节而仅仅表示0
或1
,对于每寸空间必争的下位机代码,实在是太过奢侈,所以C语言就提供了位域
或者说位段
的数据结构。
所谓位域
是把一个字节中的二进制位划分为几个不同的区域,并说明每个区域的位数。每个域都有个域名,允许在程序中直接对域名进行操作。位域定义与结构体定义相仿,其形式为:
/*
Struct 位域结构名 {
位域列表:(类型说明符 位域名:位域长度);
};
*/
struct bs {
int a:8;
int b:2;
int c:4;
};
其中,位域a占用8位,位域b占用2位,位域c占用4位。使用的方式如下:
struct bs bs_tst; // 声明位域空间,名称为bs_tst
bs_tst.a = 1;
bs_tst.b = 7;
// 若是赋值超过位数,那么会自动截取保留对应的位数,超过位数丢弃譬如
bs_tst.c = 0x1c;
printf("a = %x; b = %x , c = %x", bs_tst.a, bs_tst.b, bs_tst.c);
实际输出结果bs_tst.a = 0x01; bs_tst.b = 0x07; bs_tst.c = 0x0c;
对于位域的定义和使用有以下几点需要说明:
- 位域成员的类型必须为
unsigned
或int
型。 - 一个位域必须存储在同一个字节中,不能跨字节,因此也可得出结论,1个位域不得超过8位。
- 位域可以无位域名,这时它只用来作填充或调整位置。无名的位域是不能使用的。
参考链接:
C语言中文网——C语言位域;
大兔子博客——C语言结构体之位域(位段);
至此记录完毕。
记录时间:2017-2-7
记录地点:深圳WZ