基础04:移码和浮点数的二进制表示

本文介绍移码以及浮点数的二进制表示。其中浮点数的二进制表示比较难理解,需要一点点数学知识。

标准移码

在一般情况下,移码就是将补码的符号位取反。
-118D = -1110110B (真值)
-118D表示-118的十进制;-1110110B表示二进制。
原码: 11110110
反码: 10001001
补码: 10001010
移码: 00001010

符号位取反的移码,可以等同于偏移值为128的移码,称为标准移码。
即-118D+128D = 10001010B + 10000000B = 00001010B。
移码,可以理解为补码加上偏移值,即将整个取值范围右移一段距离,从移码中可以直接看出真值的大小。
-128[移]: 00000000
-127[移]: 00000001
-126[移]: 00000010
……
+126[移]: 11111110
+127[移]: 11111111

移码的定义

X[移] = 2^(n-1) + X, -2^(n-1) <= X <= 2^(n-1) -1
X为真值,X[移]表示真值X的移码。
举个栗子:
一个字节,n=8。X[移] = 128 + X, -128 <= X <= 127

浮点数二进制表示

浮点数的二进制表示,分为三个部分。
sign,符号位。0表示正,1表示负。
exponent,指数位。采用2^(n-1) - 1的移码。n表示指数位位数。
fraction,小数位。

浮点数的位数如表所示。

—- sign exponent 移码 fraction
32位 1 8 2^(8 - 1) - 1 = 127 23
64位 1 11 2^(11 - 1) - 1 = 1023 52

在深入一点

浮点数的二进制表示用数学表示。
V= (−1)^S ×M × 2^E
(-1)^S表示符号位,当S=0,V为正数;当S=1,V为负数。
M表示有效数字,大于等于1,小于2。
E表示浮点数的指数。

对于M,1<=M<2,M可以写成1.xxxxxx的形式,其中xxxxxx就是小数部分,由0,1组成。IEEE754规定,第一位总是1,可以被舍去,只保存后面的xxxxxx部分。比如保存1.01的时候,只保存01,等到读取的时候,再把第一位的1加上去。

指数E的特殊情况(32位浮点数为例)

浮点数的指数E E的值 M的值 数值
-127 0 全0 ±0
-127 0 M小数点前不加1
0.xxxxxx的形式
128 255 全0 ±无穷
128 255 非0 NaN

  • 浮点数的指数E移码(偏移127)后得到E的值。
  • E全为0。浮点数的指数E等于-127,有效数字M不再加上第一位的1,而是还原为0.xxxxxx的小数。目的是为例表示±0,以及接近于0的很小的数字。
  • E全为1。如果有效数字M全为0,表示±∞(正负取决于符号位s);如果有效数字M不全为0,表示这个数不是一个数(NaN)。

举个两个栗子

9.0的表示方法:
为正数,所以sign=0。
9.0D = 1001.0B = 1.001*2^3B。 注意:小数点不是十进制的小数点,是二进制的小数点。 1.001D ≠ 1.001B。
所以exponent的原值是3,移值是3+127=130D=10000010B。
分数部分,去掉第一位的1,剩余001 在后面补充0,保证23位,即00100000000000000000000。
合并起来,结果为0 10000010 00100000000000000000000。

0.625的表示方法:
为正数,sign=0。
0.625D = 0.101B。其中0.1B = 0.5D = (1/2)^1;0.01B = 0.25D = (1/2)^2;0.001B = 0.125D = (1/2)^3。
0.625D = 0.101B = 1.01 * 2^(-1)。
所以exponent的原值为-1,采用移植是-1+127=126D=01111110B
分数部分,去掉第一位的1,剩余01,在后面补充0,保证23位 01000000000000000000000
合并起来,结果为0 01111110 01000000000000000000000

总结

  1. 移码即补码右移一个偏移量。
  2. 浮点数的二进制表示,还是很头晕的。看不懂,多看几遍。如果还是看不懂,那就看不懂吧。

如果本文对你有所帮助,请小额赞助
~~ EOF ~~