位字段
位字段对我来说,一直是个陌生的概念,因为平时不经常用到。但是并不是因为它没有实用价值,而是我平时只编编小程序而已。但是它却是个经常被考到的概念。可能就因为它很实用又很迷惑吧!所以,我现在想把它作个总结,但是可能也不全面。还有它经常与sizeof()一起被涉及到,但我发现我的帖子总是贴很长,使人看了就要畏惧心理,所以我想分开总结一下这两个概念。
下面先总结下“位字段”的几个概念:
定义:位字段简称字段,是“字”中相邻位的集合;所谓“字”是由实现定义的单一存储单元。字段定义和访问的语法基于结构。
位字段所允许的类型:C语言允许unsigned int类型,signed int类型或int类型的位字段,分别称为无符号字段,带符号字段和普通位字段。和普通字符一样,普通位字段可以无符号或带符号。C99允许_Bool类型的位字段。
应用:位段结构也是一种结构体类型,只不过其中含有以位为单位定义存储长度的整数类型位段成员。采用位段结构既节省存储空间,又可方便操作。
定义格式:unsigned <成员名>:<二进制位数>
例如:
struct bytedata
{
unsigned a:2; /*位段a,占2位*/
unsigned:6; /*无名位段,占6位,但不能访问*/
unsigned:0; /*无名位段,占0位,表下一位段从下一字边界开始*/
unsigned b:10; /*位段b,占10位*/
int i; /*成员i,从下一字边界开始*/
} data;
位段数据的引用:
同结构体成员中的数据引用一样,但应注意位段的最大取值范围不要超出二进制位数定的范围,否则超出部分会丢弃。
例如:data.a=2; 但 data.a=10;就超出范围(a占2位,最大3)
注意:
(1)一个位段必须存储在同一存储单元(即字)之中,不能跨两个单元。如果其单元空间不够,则剩余空间不用,从下一个单元起存放该位段。
(2)可以通过定义长度为0的位段的方式使下一位段从下一存储单元开始。
(3)可以定义无名位段。
(4)位段的长度不能大于存储单元的长度。
(5)位段无地址,不能对位段进行取地址运算。
(6)位段可以以%d,%o,%x格式输出。
(7)位段若出现在表达式中,将被系统自动转换成整数。
以上文献最后两段是转载网上的,特此声明。这篇文章其实并没有写完整位字段,但是目前我也没想出什么,等以后想到再加以补充吧!