这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » C语言中的位段

共1条 1/1 1 跳转至

C语言中的位段

助工
2014-10-05 20:25:37     打赏

1.位段的概念


  所谓位段,就是指以位为单位定义长度的结构体类型中的成员。


  eg:


  struct  packed-data


       {


              unsigned char a    :2;


              unsigned char b    :6;


              unsigned char c    :4;


              unsigned char d    :4;


              int           x;


       }data;


      定义了一个结构变量data,其中的成员位段a,b,c,d分别占2位,6位,4位,4位,


  成员x为整型,共占4个字节。


    通过位段的定义,就可以单独对一个字节的某一位或某一段进行操作。这对单片机


来说,是非常有用的,特别是不我们设置寄存器时。


  union  io_pdr0


      {


              unsigned char byte;


              struct{


                     unsigned char P00:1;


                     unsigned char P01:1;


                     unsigned char P02:1;


                     unsigned char P03:1;


                     unsigned char P04:1;


                     unsigned char P05:1;


                     unsigned char P06:1;


                     unsigned char P07:1;


                     }bit;


      }P0;


  这是一个关于P0口端口寄存器联合类型的定义,包括一个无符号字符变量byte和一个结构变量bit,结构变量中使用了位段的定义。从中可以看到,即可以对P0口写入一个字节,也可以对某一位单独赋值。例如:


       P0.byte=0x80;


       P0.bit.P00=1;


都是正确的。


2.有关位段的说明


(1)位段在存储单元中的空间分配方向为从右到左,如图所示:


 




                                                                                    图1  位段空间分配图


(2)可以定义无名位段。如:


 


Struct


{


       unsigned char  a:1;


       unsigned char   :2; (这两位空间不用)


       unsigned char  b:3;


       unsigned char  c:2;


}x;


 




                                                               图2   无名位段


如图所示,a和b之间的是无名位段,占2位,这两位的空间不用。


(3)位段的长度不能存储单元的长度,也不能定义位段数组。


(4)要注意位段允许的最大值范围。


       如果定义位段占2位,那么最大值为3,超过这个范围的赋值,自动取赋值数的低位。


eg:


       struct  packed-data


              {


                     unsigned char a  :2;


                     unsigned char a  :6;


}data;


引用位段中的数据时,例如:


        data.a=2;


是正确的;


        data.a=8;


是错误的。因为a只占2位,最大值为3。在此情况下,自动取8的低位。8的二进制数形式为1000,a只有2位,所以取1000的低2位,即取00,那么data.a的值为0。


共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]