学习笔记:计算机组成原理Ch2.数据存储
本章主要介绍补码、IEEE754标准。
可以由下面链接得到知识
冯文斌:浮点数的二进制表示(IEEE 754标准)关于编程哪些事:原码、反码、补码 详解!不懂的请看过来!
先讲解一下补码:(two’s complement):
补码的 产生的由很多元素导致的,一开始,人们用机器码表示数字,也就是在最高位放一个Sign,1表示负,0表示正。
但是发现,只有正数相加,如果相减就完犊子了
秉持着一种把减法变成加法的理念,就把负数的除Sign位变成了反数,看起来就ok了,但是发现,自己减自己能出来个-0
如是,就想到了新的编码,补码,其实就是在反码的基础上+1,这样就杜绝了-0的出现,于是-0位就可以多表示一个数,岂不是美滋滋。
之后讲解IEEE 754:

如上图所示:
32位由三部分组成:
- Sign
- Exponent
- Significand
看了往年考试题,一般老师会给个16进制的数,如 7FF00000
对于这种情况,先把他转化成32位的二进制数:
可以看下面的转化表:
十六进制 二进制
0 0000
1 0001
2 0010
3 0011
4 0100
5 0101
6 0110
7 0111
8 1000
9 1001
A 1010
B 1011
C 1100
D 1101
E 1110
F 1111
那么原题目就转化为了,0111 1111 1111 0000 0000 0000 0000 0000
先来看第一位sign位:0
之后是Exp位:11111111
之后是Significance:111000000000000
那么就变成了:
$$(-1)^{0}\times2^{255-127}\times 1.111000000…$$
注意上面1.1110000是二进制小数
$$2^{128}\times 1.111000000…$$
那么最后就是:
$$2^{128}+2^{127}+2^{126}+2^{125}$$
之后我们再来看看,这个32位能表示的最大和最小的数:
如图,exponent 最大是254,signfinicant最大是1.11111111111111111111111
我们姑且把significant看作2,那么就是:
$$2^{254-127}\times2=3.4\times10^{38}$$
同理:最小的规格化正数,因为至少要留一位小数,所以exp最小就是1了,significant得小,就是1.000000000000000000
于是就有了:
$$2^{1-127}\times1.0000..$$ 也就是:
$$1.0\times2^{-126}==1.18\times10^{-38}$$
relative error就是:
$$2\times2^{-24}$$

同样的:
64位:


特殊情况,看到就不用算了:
- 0:exp位全是0,并且实数位也全是0
- Infinity:exp位全是1,并且实数位全是0
- NaN:exp位全是1,实数位不全是0
总结:如果exp位置出现了全是1,就不用算了
如果exp位置出了全是0,看看后面是不是也全是0.
下面再说一下,如何压缩数据:
香农定理告诉我们一个symble需要的最少比特:

有两种压缩方式:
Huffman Coding:
主要适合不同长度的编码,Zip就是这样
Source coding:
主要是适合有损失的压缩,去掉细节。