float类型double类型在内存的存储方式研究

最近研究了下float类型double类型在内存的存储方式,把自己学到的心得分享给大家,希望大家批评指正

本次测试基于32位操作系统下做测试:


1.基础知识补充

首先float类型和double类型各个数据段所占的位数(bit)如下:


浮点数在计算机的表达方式为:符号位 尾数 * 2^指数。如 1.11*2^3.

对应关系如下:


其中:   符号位:1位,0表示正数,1表示负数

            指数部分:存储浮点数的指数,由于指数可以为负数,一般在在存储float类型时会加上127进行存储,存储double类型时会加上1023进行存储

            尾数部分:存储浮点数的底数,因为高位为1省略不存。

2.代码验证

对于float类型的数据13.375:

第一步:对整数和小数部分进行换算

13 = 1101      0.375 =0 * 2^-1 + 1 * 2^-2 + 1 * 2^-3 + 0 * 2^-4.........等等直到和整数部分1101加起来达到24(不是23,因为尾数的最高位不存)位结束计算

13.375 = 1101.0110 0000 0000 0000 0000 = 1.101 0110 0000 0000 0000 0000 * 2^3

符号位:13.375为正数, 所以符号位为0

指数位:由于float指数存储时需要加上127, 所以指数位存储的值为3 + 127 = 130 = 1000 0010

尾数部分:1.101 0110 0000 0000 0000 0000在内存的存储方式为1101 0110 0000 0000 0000 0000,去除最高位的1,存储方式为101 0110 0000 0000 0000 0000

所以float类型的数据13.375在内存的存储方式如下:

0 + 1000 0010 + 101 0110 0000 0000 0000 0000

0100 0001 0101 0110 0000 0000 0000 0000

下面代码验证一下:


41560000转换为2进制为:

0100 0001 0101 0110 0000 0000 0000 0000

验证我们的方法为正确。

对于double类型的数据存储,原理同float类型,有兴趣的同学可以自己验证下。

阅读更多

没有更多推荐了,返回首页