IEEE-754浮点型存储方式

最近突然纠结与浮点型到底是怎么存储的,看了很多理论描述,以为没有找到特别详细的例子,还是一脸懵逼。所以我特意记录一下浮点型变量存储方式的例子。
以最常用的IEEE-754标准为例,单精度浮点型的二进制主要分为三部分:数符、阶数、尾数(阶数也包含一位阶符,但从存储上看应该是三部分)。
公式为:数符x尾数x2^阶码 (1)
数符决定正负,尾数决定精度,阶码决定大小。比如:
-1.0111x2^-1001 (前面的-是数符,1.0111是存储的尾数,-1001是阶数,其实阶码就是十进制-9)
在IEEE-754标准中,单精度浮点型(float型)是4字节,32位,其中一位阶数,8位阶码和23位尾数。如图:
在这里插入图片描述
(图片来源于网络)
下面通过一个例子来了解浮点型怎么存储的。

  1. 求内存中浮点型11000000100010000000000000000000对应的十进制原型
    分割:1(存储的数符)10000001(存储的阶码)00010000000000000000000(存储的尾数)
    符号:-(0为正,1为-负)
    求尾数:1.0001(尾数求值方式为整数部分为1,小数部分为内存中存储的尾数0001,省略了后面的19个0)
    求 阶码原码:(内存中存储的二进制为阶码的移码再减去1,移码等于补码的符号位取反,换算成十进制计算就是阶码加上127等到存储阶码,这就是很多书上说的位移127,所以逆运算可以求得阶码)
    10000001(存储的阶码)
    10000010(加一得移码)
    00000010(符号位取反得补码)
    00000010(根据补码求得原码)
    所以求得阶码原码是00000010。
    也可以用十进制方式求:
    (二进制)10000001=(十进制)129
    129 - 127 = 2 = (二进制)00000010(阶码得原码)
    根据公式(1)得:
    -1.0001 x 2^2 = -100.01 (阶码为2,所以小数点右移2位)
    整数部分为-100,化为十进制等于-4;小数部分为0.01化为十进制等于(0 x 2-1) + (1 x 2-2) = 0.25
    所以最终十进制为:-4.25

  2. 反过来求浮点型-4.25的二进制存储
    分割:-(数符)
    4(整数部分)= (二进制)100
    0.25(小数部分)= (二进制)0.01
    小数部分如果数据较大使用乘2取整数法求对应的二进制。例如:0.3456
    0.3456 x 2 = 0.6912 取整数部分为0
    0.6912 x 2 =1.3824 取整数部分为1
    0.3824 x 2 = 0.7648 取整数部分为0
    0.7648 x 2 = 1.5296 取整数部分为1
    0.5296 x 2 = 1.0392 取整数部分为1

    得到的二进制就是0.01011…

将整数部分与小数部分相加得到:-100.01
规范化(IEEE-754要求规范化):-1.0001 x 2^2
存储数符位:1
存储的尾数位:00010000000000000000000(1.0001取小数部分然后补零够23位)
存储的阶码求值方式:
00000010(原码,正2的二进制)
00000010 (补码)
10000010 (移码)
10000001 (存储的阶码,移码减一)
十进制计算方法:
2 + 127 = 129 = (二进制)10000001
所以最终-4.25在内存中的存储二进制为:
110000001 00010000000000000000000

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值