c语言字段结构 位字段结构


一、位段简介

当计算机应用于 过程控制、参数检测、数据通信领域时,要求其应用程序具有对外部设备接口硬件进行控制和管理的功能。
使用接口发送方式字或命令字,以及从接口读取状态字等。与接口有关的命令字、方式字、状态字、都是以二进制(bit)位为单位的字段组成的机构,我们将这种以二进制位为字段的数据称之为位字段数据。


位字段数据是一种数据压缩形式,数据整体没有实质意义位字段中的数据没有意义
因此,在处理位字段数据时,总是以组成它的位字段为处理对象。c语言中,位操作(位逻辑与 逻辑或)对位字段进行处理。
c语言还提供一种位字段的构造类型---位字段结构。


位字段结构是一种特殊形式的结构,它的成员项是二进制字段。

位字段结构定义方式:
unsigned 成员名:位数;


struct weiZiDuan{
unsigned a1:2;
unsigned a2:1;//成员a1 a2 占用一个存储单元
unsigned :0;
unsigned a4:3;
unsigned a5:1;//成员a4 a5占用一个存储单元
};

二、位段注意事项

位段结构注意事项:
1: 位段结构以单个unsigned型数据为单位,其内存存放一连串相邻的二进制位,一个位段结构在内存中是连续存放,例:先存放a1 紧跟着存放a2 …a4 a5。
2: 若位段结构中的一个位段需从另外一个字节开始存放,那么在位段结构体中,需要使用一个不带名字的位字段,后面位数写上0,表明此字段是位字段填充物,程序中需采用这种无名字段来填充占满整个unsigned型数据的其它位, 使得下一个成员a4从相邻的下一个unsigend开始存放。
3: 位字段结构在程序中的处理方式同普通的结构体处理方式相同。
4: 位段结构中的一个位段 必须存储在一个unsigned中,
如果unsigned中剩余位数不足以存放位段,那么将会开辟下一个unsigned存储;

一个位段的结构不能大于存储单元的长度(不能大于unsigned的长度(unsigned的长度等于计算机的位数));

位段不能定义为段数组;
5: 位段中的数据可以和变量进行各种运算,但不能对位段结构中的成员项进行取地址(&)运算。
例:
strunct weiZiDuan test;
test.a1=1; //正确
test.a2 =2; //错误因为2转换为二进制占两位,所以放入位段中错误
test.a1=3; //正确
test.a1=5; //错误 因为5转换为二进制占3为,所以放入位段中产生错误


相关阅读:
linux c逻辑与 逻辑或简介
c语言结构体定义
linux c 何时用 . 何时使用->

sizeof用法(sizeof中加入unsigned 所占用的长度 4字节 )