位段
位段定义,赋值,输出,占用的问题说明
遇到位段相关的问题,这里记录下来:
typedef struct A
{
int a:5;
int b:3;
}NEWSTRU;
int _tmain(int argc, _TCHAR* argv[])
{
char x[100] = "0123456789";
NEWSTRU te;
memcpy(&te, x, sizeof(NEWSTRU));
printf("value is A-HEX:%X, A-DEC:%d B-HEX:%X,B-DEC:%d te-(int) %X\n",te.a, te.a,te.b,te.b, *((int *)&te));
return 0;
}
打印结果如下:
value is A-HEX:FFFFFFF0, A-DEC:-16 B-HEX:1,B-DEC:1 te-(int) 33323130
最初对结果非常不解,下面是解释:\
此时,如果以%d输出的话,则取补码(取反+1)然后前面加个负号
如果以%X输出的话,则高位填充1,然后直接打印出来
举例:
以下struct A为例,
{
int a:5;
int b:3;
}
被拷贝值 0x30
则打印 a = -16或者 0xfffffff0
b = 1
另,位段只能以int, unsigned int, signed int 来定义,且定义的位段大小不可以超过sizeof(int)
连续几个位段变量,如果大小之和都在sizeof(int)内的话,将挤在一起
但是如果当下一个位段变量挤不下的话,将抛弃上面的空间,从新开始
举例:
这里 int为32位
{
int a:31;
int b:3;
}
则b将另起计算空间,而不使用a剩下的1bit
struct A
{
int a:4;
int b:4;
}
则ab将挤在一起,假设struct A = 0x000102CD
则a = 0x0D
b = 0x0C