在结构体的实际使用中,可能会用到带冒号的单元分配使用,其占的空间是有变化的,打个比方,如下。
typedef unsigned char U8;
typedef struct
{
      U8 B0:1;
      U8 B1:1;
      U8 B2:1;
      U8 B3:1;
      U8 B4:1;
      U8 B5:1;
      U8 B6:1;
      U8 B7:1;
}StructCode1;
typedef struct
{
      U8 B0;
      U8 B1;
      U8 B2;
      U8 B3;
      U8 B4;
      U8 B5;
      U8 B6;
      U8 B7;
}StructCode2;

int main(int argc, char* argv[])
{
      StructCode1 ss;
      StructCode2 tt;
      U8 st=sizeof(ss)/sizeof(U8);
      U8 ts=sizeof(tt)/sizeof(U8);
      printf("data is %d,%d/n",st,ts);
      return 0;
}
输出结果是1,8。也就是说前者是按位分配了空间,后者是正常分配。

      那么对应的,这种位数据成员在实际使用赋值时,也有其特殊的地方。如下例:

Typedef struct 
{
      unsigned char a:2;
      unsigned char b:4;
      unsigned char c:2;
}dataS;

int _tmain()
{
      dataS tt;
      memset(&tt,0xaa,sizeof(dataS));  //注意此时memset的设定长度只能是分配给tt的栈长度,大于就会报错

      printf("%d %d %d",tt.a,tt.b,tt.c);
}

输出2 10 2。为什么呢?因为写入的0xaa二进制是10101010,分别赋给abc对应的位。然后取出每个作为一个单独的数值,即10,1010,10,得到输出结果。