利用结构体定义位域,可以观察浮点数内部是如何存储的,看代码:
#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\n",p->sign);
printf("%d\n",p->exponent-127);
printf("%d\n",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\n",pc->a);
printf("%x\n",pc->b);
return 0;
}
参考:https://blog.csdn.net/yusiguyuan/article/details/42212271
来源:https://www.cnblogs.com/litifeng/p/12306438.html