一个位域问题

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


简单说明下位域的规则

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




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值