利用结构体定义位域,可以观察浮点数内部是如何存储的,看代码:
#include<cstdio> using namespace std; struct fp{ unsigned fraction:23; unsigned exponent:8; unsigned sign:1; }; int main(){ float a=0.1; fp *p=(fp*)&a; printf("%d ",p->sign); printf("%d ",p->exponent-127); printf("%d ",p->fraction); return 0; }
位域在本质上就是一种结构类型, 不过其成员是按二进位分配的。关于位域的几点说明:
1、位域以二进制位来存储数据,可以在冒号左边是位域名,冒号右边是位域的长度。
2、位域按定义顺序存储,记住是从存储变量的个位,也就是最右边开始的。
3、一个位域必须存储在同一个字节中,不能跨两个字节。如一个字节所剩空间不够存放另一位域时,应从下一单元起存放该位域。也可以有意使某位域从下一单元开始。
4、来确定结构体类型的成员变量的值所占的字位数,如果在实际应用中,该变量的值超出了在声明它时所声明的字位数,那么溢出的部分将会丢失。
struct bs { unsigned a:4 unsigned :0 /*空域*/ unsigned b:4 /*从下一单元开始存放*/ unsigned c:4 }
在这个位域定义中,a占第一字节的4位,后4位填0表示不使用,b从第二字节开始,占用4位,c占用4位。
再看一个代码:
#include<cstdio> using namespace std; struct test{ unsigned char a:4; unsigned char b:4; }; int main(){ char c=12; test *pc=(test*)&c; printf("%x ",pc->a); printf("%x ",pc->b); return 0; }
参考:https://blog.csdn.net/yusiguyuan/article/details/42212271