浮点数在内存中的存储
发布日期:2021-05-07 11:07:41 浏览次数:11 分类:原创文章

本文共 1004 字,大约阅读时间需要 3 分钟。

正数在内存的存储是以最高位为符号位,其余为数值的二进制序列,那么浮点数在内存中是怎么进行存储的呢,接下来我们一起看一看;

假设一个数为1154,那么用科学记数法可以表示为1.154*10^3,同理在计算机中也可以用科学计数法进行存储,那么他是怎么进行的呢?

比如:10在计算机中是以二进制储存的,即1010,转化为科学技术法为 (-1)^s* 1.01*2^3;
规定有,s为符号位,0代表正数,1代表正数,M=1.01代表有效数字,E=3, 2^E代表指数位;
对于32位浮点数,最高的一位比特位是符号s位,接下来的8位是指数E,剩下的32位为有效数字M,如图所示:
在这里插入图片描述

1.M的存储:在上述中,可以清晰的认知到1<=M<2,即M的首位永远都是1,那么进行存储时就被不在对1进行存储,只存1后面的数字,如此一来M可以保存24位有效数字;
M的存储是在图中M位处的最左端开始,多余的比特位补0处理;

2.E的存储:很显然E是一个无符号整数,8个bit取值范围为0-255,又可知科学计数法中指数是可以出现负数的,那么就有了规定,当存储E的时候需要加上127,即存储的是 E=10+127;

3.E的读取:第2点讲到,E存储的时候是加上127的,当然读取的时候也要减去127,可是有如下2种特殊情况:
3.1.当E为全0时,很显然读取E的时候减去127为-127,那么很容易理解这样一来2^E会非常小近乎于0,计算机就将此时的浮点数表示为0,并且这个0值不是唯一的;
在这里插入图片描述
如图,当E取值靠近0时,E-127的值都非常小,整个浮点数的值也会趋近于0,在这个区间内有无数个E值使得浮点数的值表示为0,因此在进行浮点数的判断的时候不能直接如下所示
if(floa==0),而应该表示为一个区间,例如if(floa<-10^-9 && floa>-10^-9),因为浮点数的0值是一个区间;

3.2当E为全1时,这是2^E就会非常的大,即达到了浮点点数极值,S位决定了浮点数的取值区间;

附:64位双精度浮点数中,E的比特位为11位,M为52位,E进行存取时加减1023,其余同理;

深度理解,图文解析

在这里插入图片描述

注意:float用printf输出的时候,是需要先转换成double再进行输出,这就不难理解,很多float类型的数据用整形输出都是0,因为float转换成64位后,很多时候前面32位都是0,而整形输出只能截取32位的值;

上一篇:const的作用
下一篇:整形提升之原来如此

发表评论

最新留言

感谢大佬
[***.8.128.20]2025年03月28日 02时22分04秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章