博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
基础04:移码和浮点数的二进制表示
阅读量:6705 次
发布时间:2019-06-25

本文共 1837 字,大约阅读时间需要 6 分钟。

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

标准移码

在一般情况下,移码就是将补码的符号位取反。

-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 ~~

转载地址:http://dfdlo.baihongyu.com/

你可能感兴趣的文章
How do I create a List in Scala?
查看>>
lintcode:移动零
查看>>
JavaScript闭包之“词法作用域”
查看>>
BZOJ2679 : [Usaco2012 Open]Balanced Cow Subsets
查看>>
如何实现比较复杂的分组、小计与合计
查看>>
IIS7.5上的REST服务的Put操作发生HTTP Error 405.0 - Method Not Allowed 解决方法
查看>>
咱们来聊聊JS中的异步,以及如何异步,菜鸟版
查看>>
BZOJ3346 : Ural1811 Dual Sim Phone
查看>>
i++与++i 辨析
查看>>
ImportError: The _imagingft C module is not installed
查看>>
tomcat的webappclassloader中一个奇怪的异常信息
查看>>
Java语言与C++语言的差异总结
查看>>
Semaphore实现Andoird版源代码剖析
查看>>
使用gSoap规避和改动ONVIF标准类型结构的解析
查看>>
架构设计之策略模式
查看>>
hdu 5400 Arithmetic Sequence(模拟)
查看>>
求职(2015南京站获得百度、美的集团、趋势科技、华为offer)
查看>>
压测 apache ab 初探
查看>>
设计数据结构O1 insert delete和getRandom
查看>>
视图(View)与部分视图(Partial View)之间数据传递
查看>>