本文主要是介绍关于位结构体及位操作总结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
#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。当然,这里还涉及到字节及位的存储顺序问题。
这篇关于关于位结构体及位操作总结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!