浮点型在内存是如何存储的?

浮点型是带有小数部分的数据类型。浮点型包含单精度浮点型(float)和双精度浮点型(double)。
单精度和双精度的差别在于所占用的内存大小不同。
float 类型要占用 4 个字节的内存空间,每个字节 8 位,总共 32 位;double 类型占用 8 个字节的内存空间,共 64 位。double 比 float 具有更高的精度和更大的表示范围。浮点数在内存的存储方式如下图:

图片
符号域指数域尾数域指数偏移量
单精度浮点数1位[31]8位[30-23]22位[22-00]127
双精度浮点数1位[63]11位[62-52]52位[51-00]1023

为什么会有偏移量是因为指数域有正数和负数,所以通过偏移量来存储指数域数据。举个例子,假设 -4.25 如何转化为内存的存储方式?

  1. 将4.25转化为二进制 -4.25=-100.01,简单做个补充:浮点型转化二进制分为两部分,整数及小数。4 二进制为0100,0.25 * 2 取整数部分,直到为 1 结束,结果为 01,-4.25 将两部分合并起来就得到 -100.01。
  2. 将二进制格式实数的小数点左移或右移n位,直到小数点移动到第一个有效数字的右边。该方法为科学计数法。100.01=-1.00101*2^2    
  3. 从小数点右边第一位开始数出二十三位数字放入第22到第0位,不足23位补 0。 
  4. 浮点数为正,则在第31位放入 0,否则放入 1。
  5. 由于小数点向右移了两位,所以单精度的偏移量是 2+127,如果是双精度则 2+1023,然后将得到的结果转化为二进制从左往右依次填入指数域。单精度类型的 -4.25 最后的存储方式如下图:图片

扩展知识:假设定义一个变量 float f=-4.25;这样定义正确?一定要记住,这是不正确的。-4.25 是双精度类型,将双精度类型向下转换成单精度类型会造成精度丢失,所以要把-4.25强制转换为单精度类型,即 float f = (float)-4.25;或者可以 float f=-4.25f。f不区分大小写。
最后,祝大家学习愉快!

阅读原文


作者简介: 廉颇老矣,尚能饭否。 欢迎关注微信公众号:哩厚dotNET

声明:文中观点不代表本站立场。本文传送门:http://eyangzhen.com/218343.html

联系我们
联系我们
分享本页
返回顶部