移码的再总结
@(组成原理)
在总结原码,反码,补码的表示范围时,忽略了对移码的总结,现在看移码本身的表示范围与IEEE754使用的特殊阶码,有点迷惑,思考后才明白,这其中的关节。
首先我们明白移码与补码有相同的表达能力。也就是说,给定相同的机器字长,它们的表达范围相同。
比如,8位机器字长,都用1位表达正负。
则补码的表示范围:
[−27,+27−1]=[−128,+127]
移码的表示范围:
[−27,+27−1]=[−128,+127]
二者相同。
如果换一种说法,n位阶码,等同于n位机器字长。也需要用一位表示正负。
移码只用于表示整数。
定义:在真值上加上一个常数,这个常数叫偏置值。通常取 2n ,这个n是数据位,即机器字长去掉一个符号位。
表达范围 [−2n,+2n−1],机器字长n+1位
值得关注的特点是:
- 0的表示唯一。 [+0]移=2n+0=[−0]移=2n−0=1,000...000(n个0,机器字长n+1)
- 一个真值的移码和补码仅仅相差一个符号位。无论正负。
- 移码全0时,对应的真值最小值 −2n 。移码全1时,对应真值的最大值 2n−1 。
- 移码保持了数据原有的大小顺序,移码大真值就大,移码小,真值就小。
特别思考最后一条。对于正数,因为符号位都是0,现在 2n(第n+1位是符号位,恰恰是2n) 加过来,则最高位变1,于是移码大,真值就大。
对于负数,我们以3位数据位1位符号位来看。
表达范围是:[-8,7].
补码–移码:
可见通过移码的表示法,能够更清晰的去把握补码的负数表示形式。
移码是非常自然的,从全0开始到全1,主观上与我们的直觉一致,但是表示范围与补码相同。
主要看IEEE754编码下,有8位移码.
若是单纯的用原本移码的定义,表示范围是
[−27,27−1]=[−128,127]
.
但是实际上是
[−126,127]
。
为了空两个状态表达非规格化数和无穷大,去掉了00000000(8个0),11111111(8个1).
注意,这里的状态是移码状态。所以移码最大的状态表达式是 11111110B=254 ,最小是 00000001=1 .
普通情况是真值加上偏置值求得移码表示,现在是已知移码表示求真值。偏置值取啥合适?若按正常取 27=128 ,那么最大真值就变成 254−128=126 ,最小真值变成 1−128=−127 。也就是左右各收缩一个真值。我们想想看,是为了多表达更多的大正数重要,还是表达一个极小的小数重要?更大的正数对吧!所以,偏置值往左挪一位,不能挪2位更不能3位,只用挪一个就可以表达移码本身能表示的最大正数127了。
所以,偏置值取的是127.
所以IEEE754单精度可以取得的阶码范围是 [−126,127] ,也即负数收缩了两个,正数不变。
同理,对于双精度的IEEE754编码,也是同样的分析,阶码的真值范围是[-1022,1023]。
再联想到IEEE754编码的尾数隐藏了一个数据位,所以尾数至少是1,且用原码表示,所以就很容易知道所有IEEE754相关的数值范围问题了。
IEEE754:
- 单精度:1, 8, 23(隐藏一位,实际精度是24位)
- 双精度:1,11,52(隐藏一位,实际精度是53位)
比如,最小正值分别是:
1.0×2−126,1.0×2−1022
最大正值分别是:
(2−2−23)×2127,(2−2−52)×21023
普通的移码阶码就按照正常的分析即可,即偏置值取 2n,n是数据位数目。