一个位域问题

位域的形式
类型说明符 位域名:位域长度


简单说明下位域的规则

1.一个位域必须存储在同一个字节中,不能跨两个字节。(未考证)
2.位域长度不超过1个字节
3.位域可以无位域名,这时它只用来作填充或调整位置。无名的位域是不能使用的。


现有一段代码,求输出

typedef struct BS
{
  int a : 5 ;
  int b : 3 ;
} bs;

int main(void)
{
  bs bt ;
  char str [] = "0134789" ;
  memcpy (&bt , str , sizeof(bs));
  printf ("bt.a :%d, %d\n" , bt.a);
  printf ("bt.b :%d\n" , bt.b);  
  return 0;
}
输出值分别是-16和1


分析
结构bs中的域a、b分别占用5bit和3bit,共1个字节,因为对齐数据,sizeof(bs)为4字节,memcpy将str的前4个字节拷贝到bt中,也就是将低地址的'0'拷贝到a,b内存中,其余'1','3','4'填充到另外3字节,‘0’的二进制是00110000,bt.a的二进制值为10000,bt.b的二进制为001。

输出是4个字节的int型,需要对有符号整型进行位扩展,扩展根据最高位符号位进行判断,bt.a扩展之后就变成0xfffffff0,bt.b扩展为ox00000001,负数存储的二进制是补码,转原码后bt.a就是-16,bt.a为1




展开阅读全文

没有更多推荐了,返回首页