利用结构体观察浮点数

Posted litifeng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了利用结构体观察浮点数相关的知识,希望对你有一定的参考价值。

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

#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

以上是关于利用结构体观察浮点数的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL:为啥我不能将单个浮点数从顶点着色器传递到片段着色器?

Python中的浮点数探秘

Python中的浮点数探秘

内部格式为 GL_RGBA8 的纹理在片段着色器中显示为浮点数

九度OJ小结

float_浮点数存储结构