首先看如下代码:
#include <stdio.h>
struct mybitfields
{
unsigned short a : 4;
unsigned short b : 5;
unsigned short c : 7;
} test;
void main(void)
{
int i;
test.a = 2;
test.b = 16;
test.c = 0;
i = *((short *)&test);
printf("%d\n", i);
}
上述程序输出为:258
因为结构体中a只占4位,b5位,c七位,由于内存需要字节对齐。如果是小段存储的话,则分布为00000010,00000001。由于是小段存储,低位在低位,高位存在高位。所以如果用两字节的short来获取,则为00000010,00000001,取值为2^8+2 = 256。即优先补全字节的高位,当高位满了,然后再取后面的内存继续存储。
同理,如果b=3,则结果又是什么呢?
答案是50。
为什么呢?同理在内存中,可以看到分布是00110010,00000000。所以以两个字节获取后大小为3*16+2=50,(注意小端存储模式,以及short的字节数);
同时注意,在确定多少字节作为一个数的时候,注意只看指针的类型,如本例中尽管i是int型4个字节,但指针为short*,所以去内存时为两字节存储。
由上面的分析,现在如果c=1,输出为多少呢?答案是770.
如果将c的位数改为8位会是什么情况?
如果是
i = *((short *)&test);则i变回258了,因为有字节对齐,所以内存分布如下,用16进制,02,01,01,00,因为是short指针,所以为256+2=258;
i= *((int*)&test);则i为65794,2^16+^8+2=65794;
总之,可以理解为,根据字节对齐理论,一般对齐为2的倍数,或者和最大字节宽度。然后根据内存大小来填满。如果比较紧张就凑在一个字节填满,还是要注意高位低位,小端的是高位填高位。
不过其实我还是有一个地方不明白:为什么a和b能够挤在一个字节,而c为什么不能和b一起挤在一起呢?求解释