正文

关于位结构体和union的一些介绍2006-11-10 17:22:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/colormoon/20169.html

分享到:

在写通讯协议的时候用到有关位结构体和union的相关内容,整理一部分东西:

首先摘一段《C语言编程宝典》上关于位结构体的说明:

/*************以下文字摘自《C语言编程宝典》********************/

位结构是一种特殊的结构, 在需按位访问一个字节或字的多个位时, 位结构
比按位运算符更加方便。
    位结构定义的一般形式为:
     struct位结构名{
          数据类型 变量名: 整型常数;
          数据类型 变量名: 整型常数;
     } 位结构变量;
    其中: 数据类型必须是int(unsigned或signed)。 整型常数必须是非负的整
数, 范围是0~15, 表示二进制位的个数, 即表示有多少位。
    变量名是选择项, 可以不命名, 这样规定是为了排列需要。
    例如: 下面定义了一个位结构。
     struct{
          unsigned incon: 8;  /*incon占用低字节的0~7共8位*/
          unsigned txcolor: 4;/*txcolor占用高字节的0~3位共4位*/
          unsigned bgcolor: 3;/*bgcolor占用高字节的4~6位共3位*/
          unsigned blink: 1;  /*blink占用高字节的第7位*/
     }ch;
    位结构成员的访问与结构成员的访问相同。
    例如: 访问上例位结构中的bgcolor成员可写成:
      ch.bgcolor
 
    注意:
    1. 位结构中的成员可以定义为unsigned, 也可定义为signed,  但当成员长
度为1时, 会被认为是unsigned类型。因为单个位不可能具有符号。
    2. 位结构中的成员不能使用数组和指针, 但位结构变量可以是数组和指针,
如果是指针, 其成员访问方式同结构指针。
    3. 位结构总长度(位数), 是各个位成员定义的位数之和,  可以超过两个字
节。
    4. 位结构成员可以与其它结构成员一起使用。
    例如:
     struct info{
          char name[8];
          int age;
          struct addr address;
          float pay;
          unsigned state: 1;
          unsigned pay: 1;
          }workers;'
    上例的结构定义了关于一个工从的信息。其中有两个位结构成员, 每个位结
构成员只有一位, 因此只占一个字节但保存了两个信息, 该字节中第一位表示工
人的状态, 第二位表示工资是否已发放。由此可见使用位结构可以节省存贮空间。

/******************************************************/

补充说明一点,如果要定义超过两个字节的位结构体,需要注意,按字节填充!!!即:

比如定义一个4字节的位结构体,应该这样定义:

struct bitstruct {

          unsigned a: 8;

          unsigned b: 1;

          unsigned c: 2;

          unsigned d: 5:

          signed int e:16;

}data;

而不要这样定义:

struct bitstruct {

          unsigned a: 8;

          unsigned b: 1;

          unsigned c: 2;

          signed int e:16;

          unsigned d: 5:

}data;

因为C语言在填充的时候,最小的填充方式是按字节填充的,所以要以字节为单位。

关于和union的结合

union因为其可以互换的数据结构,在数据通讯协议中常常会使用到,一般我们这样定义数据通信协议结构包

struct rawstruct{

          int a;

          long b;

};//2+4 = 6 byte

union rawstruct{

          struct rawstruct structdata;

          unsigned char  unionchar[6];  

};

这样对数据的打包和解包就能方便实现。

union和位结构体的结合:

如上面定义的位结构体,甚至可以定义下面的union结构

struct bitstruct {

          unsigned a: 8;

          unsigned b: 1;

          unsigned c: 2;

          unsigned d: 5:

          signed int e:16;

}data;

union rawstruct{

          struct bitstruct datas[8];

          signed long unionchar[8];

};

阅读(7126) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册