1 IEEE 754

小贴士:IEEE 754 虽然没有规定咋念,但是一口气念三个 E 有点尴尬。
​ 所以可以念成 “ I Triple E 754 ” ,就是 triple kill。。。。

img

加深理解,还是要动手算一两个例题,要不然就是:
脑子:我会了!
手:你会个der!

1.1

img

然后再反过来求一次机器数,就差不多掌握了。
逃)

2 浮点数的特殊表示

仔细思考就可以发现,我第二篇中的浮点数的表示范围是长0000001开始的,并没有 全0 和 全1
前面所描述的都是 IEEE 754 中规格化数的表示,下面介绍一下特殊数的表示。

以下都以单精度(float)为例:
img

+0: 0 00000000 00000000000000000000000

-0: 1 00000000 00000000000000000000000

+∞:0 11111111 00000000000000000000000

-∞:1 11111111 00000000000000000000000

这也是为什么浮点数除 0 的结果是 “ +/-∞ ” 而不是数据溢出的原因。

2.1 非数

image-20210711142615394

下图为所有的特殊数的表示范围。

img

2.2 浮点数的非规格化数以及精度问题

如图,浮点数的规格化表示范围是从 2^-126 开始的,其中GAP被用作非规格化数的表示。
从图中我们可以得到几点结论:

1、浮点数在朝着无穷的方向,可表示数的间隔越来越大,所以会产生误差。
2、越靠近原点,精度越高。
3、有误差,有舍入,就可以当做考点给新生出题,嘿嘿。
4、非规格化数的 阶 总是 2^-126 。
5、非规格化数的小数点前一定为 0 。

img

2.3 代码验证

为了更方便理解浮点数的精度问题,可以编写一个简单的输入输出程序,验证一下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
C++
#include <iostream>
#include <iomanip>
using namespace std;

int main()
{
float num;
cout.setf(ios::fixed, ios::floatfield);
while(1)
{
cout << "Enter a float number: "<<endl;
cin >> num;
cout << "Your number is: ";
cout << num <<endl;
}
}

但是运行结果非常的 amazing 啊!

61.419998 和 61.420002 是两个可表示数,两者之间相差 0.000004 。当输入数据是一个不可表示数时,机器将其转换为 最邻近 的可表示数。

哪怕不知道浮点数的精度问题,用肉眼观察就能看出来,浮点数在精确到一定程度以后会进行舍入。
img

3 非数值数据的编码表示

计算机中用 ascii码 来表示 西文和一些控制字符(回车换行一类)。
之前听一些师傅说,计算机专业都要背过ascii表,当时想怎么可能背的过,但是有了下面这张表,就好理解多了。
实际上这些信息也是存储成01序列,也是有规律的。

只需要把我圈红的背过就行。

img

3.1 汉字的表示

img

4 数据宽度和存储容量的单位

img

4.1 “ 字 ” 和 “ 字长 ” 的概念不同

4.1.1 “ 字长 ” 指数据通路的宽度。

— 字长 == CPU 内部总线的宽度、运算器的位数、通用寄存器的宽度(这些部件的宽度都是统一 的)
— 数据通路 是指 CPU 内部数据流经的路径以及路径上的部件,主要是 CPU 内部进行数据运算、存储和传送的部件,这些部件的宽度基本上要求一致,才能相互匹配。
简单来说,就是下图中的几条数据线传输的数据宽度必须相同,传入 32位 就必须传出32位。

img

4.1.2 “ 字 ” 表示单位,用来度量数据类型的宽度
— 字 和 字长 的宽度可以一样,也可以不同。

SUCH AS

SA1
对于 x86 体系架构,不管字长多少,定义 “ 字 ” 的宽度都为 16位 ,而从 386 开始字长就是 32位 了。
SA2
对于 MIPS 32 体系结构,其 字和字长 都是 32位 。

MIPS 32是啥?
👴只能说,“ 👴也不知道 ”

img

小细节

计算机中小写 “ k ” 表示的是 10^3 大写 “ K " 表示的是 2^10.
还是列个表看着舒服:

k(小写) 表示 10^3 例如: kb/s == 千比特每秒
K(大写) 表示 2^10 例如: 1KB == 2^10字节 == 1024B
b 表示 比特(位) 例如:1B == 8b
B 表示 字节 例如:1B == 8b

并且在不同的机器中,某些数据类型的数据宽度会有所改变。

img

同类型数据并不是所有机器都采用相同的宽度,分配的字节数随ISA、机器字长和编译器的不同而不同。

今日份壁纸