重温 位域
typedef struct tagHEADER
{
unsigned short ver:2;
unsigned short pre:1;
unsigned short cmd:5;
unsigned short flag:8;
unsigned short seq;
}HEADER,*PHEADER;
int main(void)
{
unsigned char head[4];
PHEADER h = (PHEADER)head;
//....;
return 0;
}
经过VC6.0下验证,cmd占用head[0]的高5位(cmd内部是高位在前,低位在后),ver占head[0]的低2位,seq占head[2],head[3],低字节在前。
位域的对齐(http://baike.baidu.com/view/1256879.htm)
如果结构体中含有位域(bit-field),那么VC中准则是:
1) 如果相邻位域字段的类型相同,且其位宽之和小于类型的sizeof大小,则后面的字段将紧邻前一个字段存储,直到不能容纳为止;
2) 如果相邻位域字段的类型相同,但其位宽之和大于类型的sizeof大小,则后面的字段将从新的存储单元开始,其偏移量为其类型大小的整数倍;
3) 如果相邻的位域字段的类型不同,则各编译器的具体实现有差异,VC6采取不压缩方式(不同位域字段存放在不同的位域类型字节中),Dev-C++和GCC都采取压缩方式;
浙公网安备 33010602011771号