#include <stdio.h>
#pragma pack(1)
struct stu{
char a:4; // a占用char的低4位
char b:4; // b占用char的高4位(注意,这里实际上是与a共享同一个char的空间)
};
#pragma pack(4)
int main()
{
struct stu s={
.a=2, //a:0010
.b=3, //b:0011
};
struct stu s1={
.a=2, //a:0010
.b=8, //b:1000
};
printf("%d\n",*(char *)&s);//s打印出50: 0000 0000 0000 0000 0000 0000 0011 0010(输出时符号位扩展)
printf("%d\n",*(char *)&s1);//打印出-126(0000 0000 0000 0000 0000 0000 0111 1110)
printf("sizeof %ld\n",sizeof s);
return 0;
}
#include <stdio.h>
struct mybitfields
{
unsigned short a : 4;
unsigned short b : 5;
unsigned short c : 7;
}test;
int main()
{
int i;
test.a=2;
test.b=3;
test.c=0;
i=*((short *)&test);
printf("%d ",i);
return 0;
}
在定义结构体的时候,分配的成员a 4位的空间, b 5位,c7位,一共是16位,正好
两个字节。下面画一个简单的示意:
变量名 位数
两个字节为 0000 0000 0011 0010
在执行i=*((short *)&test);时,取从地址&test开始两个字节(short占两个字节)的内容转化为short型数据,即为0x0032,
再转为int型为0x00000032,即50。输出的结果就是50。当然,这里还涉及到字节及位的存储顺序问题。