C语言特殊结构体--位域(位段)的应用

我们通常把一个有某种关联的数据做成结构体,写程序时非常方便,也更有阅读性。有些数据在存储时并不需要占用一个完整的字节,只需要占用一个或几个二进制位即可。例如开关、使能、告警等,只用 0 和 1 即可。

为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进位划分为几 个不同的区域, 并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。 这样就可以把几个不同的对象用一个字节的二进制位域来表示。

举例:

typedef unsigned char RS_U8;

 typedef struct
 {
    RS_U8 a:1;    //bit 0
    RS_U8 b:4;    //bit 1 ~ bit 4
    RS_U8 c:3;    //bit 5 ~ bit 7
}RS_STRUCT_ABC;

 typedef union
 {
    RS_STRUCT_ABC s;
     RS_U8 data;
 }RS_UNION_ABC;

 int main()
 {
     RS_UNION_ABC test;

    test.s.a=1;
     test.s.b=2;
     test.s.c=3;

     printf("a=%d, b=%d, c=%d, data=0x%.2X\n",test.s.a, test.s.b, test.s.c, test.data);

     return 0;
 }

期望结果:

 程序运行结果:a=1, b=2, c=3, data=0x65

举例告警:

typedef unsigned char RS_U8;

typedef struct
 {
    RS_U8 low_power:1;    //bit 0 欠功率
    RS_U8 over_power:1;    //bit 1 过功率
    RS_U8 c:1;    //bit 2 
   RS_U8 d:1;    //bit 3 
   RS_U8 e:1;    //bit 4 
   RS_U8 f:1;    //bit 5
   RS_U8 g:1;    //bit 6 
   RS_U8 h:1;    //bit 7 
}STRUCT_ALARM;

只需占一个节字,就可以完成8个告警数据,从而节省空间。

应用时也很简洁,比如:

STRUCT_ALARM PA_Alarm;        //定义结构体

PA_Alarm.low_power=1;        //告警赋值

猜你喜欢

转载自blog.csdn.net/llq_the7/article/details/127535863
今日推荐