结构体数据结构的位成员

      在结构体的实际使用中,可能会用到带冒号的单元分配使用,其占的空间是有变化的,打个比方,如下。
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,得到输出结果。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值