c++中浮点数的存储方式

来源:互联网 发布:大疆无人机 知乎 编辑:程序博客网 时间:2024/03/29 14:55

c++中浮点数的存储方式

最近闲来无事,一直搞不懂float类型在内存中是怎么存储的,于是潜心研究了一下,以下是一些心得:


开始之前,先简单的说一下float的四字节32位二进制分别代表的意义:

1:符号位 0正1负

2->9:阶码 0111 1111

10->32:尾码 其实就是小数点移动后,去掉左边1剩余的数(这儿可能说的不是很清晰,后面我会举例说明,很容易理解的)

以上三个名字其实不重要,理解它们所代表的含义即可,下面开始正题:


我这儿以12.25为例说明浮点数在内存中的存储方式

1.首先将12.25转换为二进制12.25->1100.01(其余各位用0填充,这儿为了清晰起见,就省略了)

2.移动小数点,例如12.25移动后为1.10001,去掉小数点左边的1,剩余的即为伪码.但是这儿由出现了一个新的问题,我们怎么区分小数点的左移和右移呢,编译器在这儿采用了一个非常巧妙的方法,利用127进行区分,如果小数点向左移动,就加上127,向右移动就减去127,即左加右减.这样就可以区分了...可能这儿说的还不是很清楚,下面会有我写的图示.


0 0111 1111->阶码 

0000 0011 1000 1000 0000 0000 0000 0000 //蓝色为符号位,红色为移码(12.25在这儿左移了三位),绿色为伪码

0 1000 0010 1000 1000 0000 0000 0000 0000//利用上面的左加右减得出 这就是浮点数在内存中的存储方式 

即0100 0001 0100 0100 0000 0000 0000 0000,转换成十六进制即为0x41440000(这块都是0,对结果没影响,如果不是0,就会有误差,这也就可以解释为什么浮点数只是一种近似存储方式)

我们在编译器中对其进行验证...

 


经过验证结果是正确的...

同理我们知道浮点数1.0在内存中的存储方式为0x3F800000 大家可以自行验证


double类型同理,大家可以自己试试...

0 0
原创粉丝点击