#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。当然,这里还涉及到字节及位的存储顺序问题。







![[某度信息流]SQL164,2021年11月每天新用户的次日留存率](https://i-blog.csdnimg.cn/direct/292e919182c04f84839e2bbe8bddf2b8.png)








![[物理专题]经典浮力题目的Fh图像绘制](https://i-blog.csdnimg.cn/direct/d69e29857a6b467f95d933189bf6bf69.png)


