浮点数的存储形式及指数采用偏码的浅析

浮点数的表示方法 and 浮点数的指数采用移码

一般而言,浮点数是由三部分组成:第一部分是表示正负号的,第二部分是小数部分,第三部分是浮点数的指数部分。

正负号采用0/1表示。

小数部分是在将所要表示的实数转化为二进制后,进行二进制科学计数法转化之后得到的小数,比如8.25—>1000.01—>1.00001x10^3 ,这样小数部分就是00001,储存在小数部分的就是00001 00…(空位补0)。

最特别的地方是指数部分:
浮点数里面表示指数的部分使用的是用“移码”表示的阶码。

什么是移码

所谓的移码,是将原码中表示正负号的位取消,全部位用来储存定点数
同时把所有定点数加上一个偏移量,使得负数全部为正数。

一般情况下,8位字节可以用原码表示(-128~127),当我们把所有数加上2^7(即所谓的**偏移常量)时,就是表示(0~255),如此就避免了负数的出现**。

同时,当我们把符号位取消时,8位字节表示的无符号整数为(0~255),正好可以容纳偏码。这也反映了偏码和原码有相同的表达能力

为什么采用移码储存指数

之所以用偏码表达浮点数里面的阶,是因为,在计算机内部对浮点数进行加减乘除的操作时,首先会比较两个浮点数的阶,并把阶对齐,这样之后才可以进行操作。

但是比较阶时,效率最高的方法是从左向右比较法,如果是以原码的方式储存阶,就要将第一位作为符号位,这样就不可避免的要对正负号进行判断之后再从左向右进行比较,这样就降低了效率。

反之,如果使用偏码,就略去了对符号位的比较

浮点数中偏移常量不合习惯的原因

但是,一般对于一个定长为n位的偏码,我们都习惯以2^(n-1) 作为偏移常量。

但是对于浮点数的阶码,我们选择加上2^(n-1)-1 作为偏移常量。

因为,在储存浮点数是,会把阶码中两种特殊状态单独拿出来作为状态标志,一个是 0000 0000 表达非规格化数,一个是 1111 1111 表达无穷大。

这样的话,偏码的表达能力(以原码解释来看)会从(0~255)缩减为(1~254),如果我们按照习惯使用2^(n-1)(即128)作为偏移常量,那么经过计算机解释过后,偏码实际表示的范围就是(1-128~254-128)=(-127~126),即最大值和最小值各缩减1。

但是从实际角度来看,我们更愿意让最小值多缩减一些,让最大值少缩减一些(实际使用中正阶数更加常见),所以我们把偏移量从128将为127,这样计算机在解释的时候,偏码的真数范围就是(1-127~254-127)= (-126~127)。

因此,计算机在解释浮点数的阶码时,就会把偏移常量定为 2^(n-1)-1. 所以我们在计算浮点数阶码的储存形式时,加上的偏移常量位127(以float为例)

以上是本人对浮点数数的一些理解,刚刚大一下学期,花了一天的时间从课本和网上的资源里面学习了浮点数储存形式的相关内容,以我认为跟简单的形式,重点解释了之前一直困扰我的指数部分的存储,学识尚浅,且是第一次写博文,如有错误,还望多多包涵 qwq

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值