位域的形式
类型说明符 位域名:位域长度
简单说明下位域的规则
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