利用结构体观察浮点数

被刻印的时光 ゝ 提交于 2020-02-14 11:14:11

利用结构体定义位域,可以观察浮点数内部是如何存储的,看代码:

#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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!