嵌入式c语言--strcut位域

struct位域

有些信息在存储时并不需要占用一个完整的字节,而只需占一个或几个二进制位,例如在存放一个开关量时,只有 0 和 1 两种状态,用一个二进制位即可。为了节省存储空间并使处理简便,C 语言又提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进制位划分为几个不同的区域,并说明每个区域的位数。
每个域有一个域名,允许程序按照域名进行操作,这样就可以把几个不同的对象使用一个字节的二进制位域表示。

位域的表示

struct 位域结构名
{
  位域列表;
}

例如:

struct pack
{
  unsigned char a:2;
  unsinged char b:8;
  unsigned char c:6;
}pck1,pck2;

注意:一个位域必须存储在同一个字节中,不能跨2个字节。当一个字节所剩的空间不够存放另一个位域时,应从下一个单元(下一个字节)起存放该位域,也可以有意使某位域从下一个单元开始。

struct bs
{
    unsigned char a:4;
    unsigned char :0;  //空域,第一个字节的后4位填0表示不使用
    unsigned char c:4;
    unsigned char d:4;
}bs1;

在这个位域定义中,a占第一字节的 4 位,后 4 位填 0 表示不使用,b从第二字节开始占用4 位,c占用4 位。另外,由于位域不允许跨2 个字节,因此位域的长度不能大于1 个字节的长度,也就是说不能超过 8 位二进制位。

#incldue<stdio.h>
struct pack
{
    unsigned char a:2;
    unsigned char :0;     //一个位域必须存储在同一个字节,不能跨2个字节,当1个宇节所剩空间不够存放另一拉域时,应从下一单元起存放该位域
    unsigned char b:8;
    unsigned char c:6;

}pak1;

struct bs
{
    unsigned char a:4;
    unsigned char :0;  //第一个字节的后4位填0表示不使用
    unsigned char c:4;
    unsigned char d:4;
}bs1
int main()
{
    printf("pack size:%d\n",sizeof(pak1));
    printf("pack size:%d\n",sizeof(bs1));
    return 0;
}

在这里插入图片描述
另外,位域可以定义在结构体内部使用,以节省空间。

你可能感兴趣的:(c语言,开发语言)