吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1299|回复: 4
收起左侧

[Java 转载] 浮点数在计算机是如何存储的

[复制链接]
Jexhen 发表于 2020-11-26 17:11
本帖最后由 Jexhen 于 2020-11-27 09:59 编辑

对二进制的除于2的常识

十进制表示 8 / 2 = 4

二进制表示 1000 / 0010 = 0100

理解:二进制除以2相当于小数点向左移动了1位

举例:

  • 1在二进制表示为0001,1/2=0.5, 按照上面的理解0.5在二进制的表示就是0001的小数点向左移动了一位,即0.1
  • 0.5在二进制表示为0.1,0.5/2=0.25,
    按照上面的理解0.25在二进制的表示就是0.1的小数点向左移动了一位,即0.01

浮点数在计算机内存的表示

以float作为举例,众所周知float在计算机中用4个byte来保存,也就是用32个bit来存储,详细如下

|| 符号位(1bit) || 指数位(8bit) || 尾数位(23bit) ||

知识

  • 规范格式为 1.尾数 × 2^实际指数,如1.101111 × 2^4
  • 符号位用1个bit表示,用于表示正负数,1为负数,0为正数
  • 指数位是指小数转化为规范格式后的指数的实际位数加上指数偏移量,8bit的指数偏移量为2^7 - 1 = 127
  • 尾数位是指小数转化为规范格式后的小数点后面的数字,每个bit只能是1或者0(因为小数点前面的数总是1所以不用保存)

举例

如27.5 = 27 + 0.5,

27在二进制表示为

二进制的值 1 1 0 1 1

0.5在二进制表示为

1 / 2 = 0001 >> 1 = 0.1

所以27.5在二进制表示为11011.1,将其转化为规范格式为1.10111 * 2^4

其在计算机内存中的表示为

  • 符号位为0(正数)
  • 指数位为 4 + 127(8bit指数偏移量) = 131,转化为二进制

    1  0  0  0 0 0 1 1

  • 尾数位为10111,由于不够23位需要后面用0补齐,即

101 1100 0000 0000 0000 0000

指数位需要用实际指数位加上指数移位量的原因

浮点数指数大小的比较结果变得显而易见。因为负数的原码,反码,补码比它绝对值的原码,反码,补码要大.
假如有两个浮点数,尾数部分相同,浮点数a的指数为-2,浮点数b的指数为2.
当直接比较两个浮点数指数大小时,会用一个1xxxxxx 来跟一个0xxxxxxx来比较.
这明显不是人类想要的结果.如果引入偏移量127,就会变成 127+(-2) 与127+2之间的比较.这样的结果才是想要的.

理解

  • 加上偏移量127,是因为在存储过程中,我们采用的原码储存。当加上127以后,正好使移码都为正数。
  • 计算机用了8位去存储指数部分,在数值上面,表示0到255,但是我们同样需要有负指数,正负指数的位数量为了均等,各自一半,-127到128,0是特殊点,特殊处理。储存时候会加上127,这样就刚刚好是0~255,就能很好的储存了,不然,不移量的话只能辨识正指数,负指数就表示不了了。

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

鸭子咯咯哒~ 发表于 2020-11-27 09:37
学习了,但还是不太懂
 楼主| Jexhen 发表于 2020-11-27 09:56
荭颜祸水 发表于 2020-11-28 00:31
 楼主| Jexhen 发表于 2020-11-28 17:37

需要部分计算机知识
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-5-15 03:51

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表