深入理解计算机系统(三)
1 IEEE 754
小贴士:IEEE 754 虽然没有规定咋念,但是一口气念三个 E 有点尴尬。
所以可以念成 “ I Triple E 754 ” ,就是 triple kill。。。。
加深理解,还是要动手算一两个例题,要不然就是:
脑子:我会了!
手:你会个der!
1.1
然后再反过来求一次机器数,就差不多掌握了。
逃)
2 浮点数的特殊表示
仔细思考就可以发现,我第二篇中的浮点数的表示范围是长0000001开始的,并没有 全0 和 全1
前面所描述的都是 IEEE 754 中规格化数的表示,下面介绍一下特殊数的表示。
+0: 0 00000000 00000000000000000000000
-0: 1 00000000 00000000000000000000000
+∞:0 11111111 00000000000000000000000
-∞:1 11111111 00000000000000000000000
这也是为什么浮点数除 0 的结果是 “ +/-∞ ” 而不是数据溢出的原因。
2.1 非数
下图为所有的特殊数的表示范围。
2.2 浮点数的非规格化数以及精度问题
如图,浮点数的规格化表示范围是从 2^-126 开始的,其中GAP被用作非规格化数的表示。
从图中我们可以得到几点结论:
1、浮点数在朝着无穷的方向,可表示数的间隔越来越大,所以会产生误差。
2、越靠近原点,精度越高。
3、有误差,有舍入,就可以当做考点给新生出题,嘿嘿。
4、非规格化数的 阶 总是 2^-126 。
5、非规格化数的小数点前一定为 0 。
2.3 代码验证
为了更方便理解浮点数的精度问题,可以编写一个简单的输入输出程序,验证一下:
1 | C++ |
但是运行结果非常的 amazing 啊!
61.419998 和 61.420002 是两个可表示数,两者之间相差 0.000004 。当输入数据是一个不可表示数时,机器将其转换为 最邻近 的可表示数。
哪怕不知道浮点数的精度问题,用肉眼观察就能看出来,浮点数在精确到一定程度以后会进行舍入。
3 非数值数据的编码表示
计算机中用 ascii码 来表示 西文和一些控制字符(回车换行一类)。
之前听一些师傅说,计算机专业都要背过ascii表,当时想怎么可能背的过,但是有了下面这张表,就好理解多了。
实际上这些信息也是存储成01序列,也是有规律的。
只需要把我圈红的背过就行。
3.1 汉字的表示
4 数据宽度和存储容量的单位
4.1 “ 字 ” 和 “ 字长 ” 的概念不同
4.1.1 “ 字长 ” 指数据通路的宽度。
— 字长 == CPU 内部总线的宽度、运算器的位数、通用寄存器的宽度(这些部件的宽度都是统一 的)
— 数据通路 是指 CPU 内部数据流经的路径以及路径上的部件,主要是 CPU 内部进行数据运算、存储和传送的部件,这些部件的宽度基本上要求一致,才能相互匹配。
简单来说,就是下图中的几条数据线传输的数据宽度必须相同,传入 32位 就必须传出32位。
4.1.2 “ 字 ” 表示单位,用来度量数据类型的宽度
— 字 和 字长 的宽度可以一样,也可以不同。
SUCH AS:
SA1
对于 x86 体系架构,不管字长多少,定义 “ 字 ” 的宽度都为 16位 ,而从 386 开始字长就是 32位 了。
SA2
对于 MIPS 32 体系结构,其 字和字长 都是 32位 。
MIPS 32是啥?
👴只能说,“ 👴也不知道 ”
小细节
计算机中小写 “ k ” 表示的是 10^3 大写 “ K " 表示的是 2^10.
还是列个表看着舒服:
k(小写) | 表示 10^3 例如: kb/s == 千比特每秒 |
K(大写) | 表示 2^10 例如: 1KB == 2^10字节 == 1024B |
b | 表示 比特(位) 例如:1B == 8b |
B | 表示 字节 例如:1B == 8b |
并且在不同的机器中,某些数据类型的数据宽度会有所改变。
同类型数据并不是所有机器都采用相同的宽度,分配的字节数随ISA、机器字长和编译器的不同而不同。
今日份壁纸