回顾
在前面的小结,主要了解的无符号数和有符号数,对于有符号数的机器数的表示改如何表示,即引入原码的概念,为了实现减法运算,进一步引入补的概念,即学习了补码表示,以及求补码过程中需要用到的反码,又由于其补码表示数据不能很好的看出其真值的大小,引入移码的概念;需要掌握原码,反码,补码,移码的求法,以及各种表示所能表示的范围,小数以及整数的范围,同时需要注意,移码只能表示整数。
二、定点表示和浮点表示
定点表示,我们在前一节其实已经大概的了解过了,就是小数固定在机器的某个位置,对于整数和小数,分别固定小数点的位置。需要明确的一点是,小数点并不会在实际的计算机中存储,而是会被隐含在机器中的固定位置。
2.1定点表示
①整数定点机
整数定点机只用于表示整数,其小数点默认在数的最后面
符号位 | 数值部分 | 小数点 | |||||
---|---|---|---|---|---|---|---|
x 0 x_0 x0 | x 1 x_1 x1 | x 2 x_2 x2 | x 3 x_3 x3 | x 4 x_4 x4 | … | x n x_n xn | .(小数点隐含在此位置) |
②小数定点机
小数定点机其小数点默认在符号位的后面
符号位 | 小数点 | 小数部分 | |||||
---|---|---|---|---|---|---|---|
x 0 x_0 x0 | .(小数点隐含在此位置) | x 1 x_1 x1 | x 2 x_2 x2 | x 3 x_3 x3 | x 4 x_4 x4 | … | x n x_n xn |
显然定点表示数字是很有缺陷的,在定点机中,由于小数点固定其存储数据的时候十分的不方便,小数只能存储在小数定点中,整数只能存储在整数定点机中,十分的不方便,因此引入了浮点表示,让小数点的位置可以浮动,这样就可以将小数表示和整数表示统一起来。接下去我们一起看浮点表示。
2.2浮点表示
浮点表示一句话了解就是,再表示数据的时候,小数点可以浮动表示,和我们之前学过的科学计数法非常的类似,比如小数 0.00098 0.00098 0.00098使用科学计数法就可以表示位 0.98 ∗ 1 0 − 3 0.98*10^{-3} 0.98∗10−3,这样我们在存储的时候,将小数部分 0.98 0.98 0.98和阶码 − 3 -3 −3分开存储,这样就可以很好的将整数和小数统一起来,例如12.13就可以表示为 0.1213 ∗ 1 0 2 0.1213*10^{2} 0.1213∗102。
①浮点表示的形式
具体来看一下浮点表示的具体形式,以32位的为例。
符号位 | 阶码 | 尾数 |
---|---|---|
1位 | 7位 | 24位 |
如上格式所示,其实就是将我们使用科学计数法的表示的数据,将其科学计数法表示的阶码写入阶码的部分,将尾数部分写入尾数部分,符号写入符号位,当然对于阶码来说,也是需要符号位的,所以7位用于表示阶数,其中一位表示阶码的符号位,6位表示阶码的数值部分,所以精确的形式,如下所示
- 阶码部分:阶符+阶码本身的真值
- 尾数部分:符号+尾数本身的真值
②浮点表示的范围
由于计算机寄存器的个数有限,所能表示的数值的位数也会有限,所以存在一个所能表示的范围。
- 最小的负数: − ( 1 − 2 − 23 ) ∗ 2 2 7 − 1 -(1-2^{-23})*2^{2^7-1} −(1−2−23)∗227−1 如何理解呢?要求最下的负数,其实就是要求绝对值最下的数,然后加上一个符号就可以,要绝对值最小的数;要求绝对值最小的数,我们先求最小的小数,就是0.00…01,即为 1 − 2 − 23 1-2^{-23} 1−2−23,进一步要让数值最小,就是要让阶码也最小,即为 − ( 2 7 − 1 ) -(2^7-1) −(27−1),所以最小为 ( 1 − 2 − 23 ) ∗ 2 − ( 2 7 − 1 ) (1-2^{-23})*2^{-(2^7-1)} (1−2−23)∗2−(27−1)
- 最大的负数: − ( 2 − 23 ) ∗ 2 − ( 2 7 − 1 ) -(2^{-23})*2^{-(2^7-1)} −(2−23)∗2−(27−1)
- 最小的正数: 2 − 23 ∗ 2 − ( 2 7 − 1 ) 2^{-23}*2^{-(2^7-1)} 2−23∗2−(27−1)
- 最大的正数: ( 1 − 2 − 23 ) ∗ 2 2 7 − 1 (1-2^{-23})*2^{2^7-1} (1−2−23)∗227−1
③浮点数的规格化
为什么要进行规格化呢?因为在使用浮点数表示数据中如0.00…1,这种就很没必要,因为我们都是先将数据写为科学计数法的形式来表示,为什么就不能变成0.1然后减小阶码呢?而且这样还可以进一步提高数据的精度;例如数据0.00111,假设只能保存四位数据,不规格化的话,存储就是0.0011,必然会舍弃掉不能表示的位数,若进行规格化变为0.1110,然后减小阶码的值,这样即能不损失精度,还能很好的表示数字。
规格化的规则,就是要求小数部分的数据必须是大于或者等于0.5的,按着二进制来说,就是要求小数的数据第一位必须是1,即为0.XXXXX…的形式。
这就是浮点数表示的规格化表示。
2.3 IEEE754标准
这是进一步对浮点数据进行规格化表示, IEEE754标准规定在计算机中存储的数据,其阶码采用移码表示,其小数部分采用原码表示,同时在IEEE754标准中有两种表示小数的格式,一种是双精度类型,一种是单精度类型。
- 单精度类型:其占32位,8位的阶码,24位的尾数(该尾数包含符号位)
- 双精度类型:其占64位,11位的阶码位,53位的尾数(该尾数包含符号位)
同时为了进一步提高数据在计算中表示的精度问题,由于在浮点数规格化的表示中,其尾数的最高位是1,那么这样的化,就进一步将其1隐含表示,例如尾数为0.101,在IEEE754标准中,1要隐含表示,即变为0.01,将1隐含表示,进一步提高了数据表示的精度。
需要注意的是,在IEEE754标准中阶码全0和全1,有其他的作用,此时就不再表示数据了,我们先来看32位的单精度的浮点数,8位阶码总共可以表示的范围是 − 128 至 127 -128 ~ 至 ~ 127 −128 至 127,因为对于正0和负0,其补码都是全零变位移码就是1后面全零,将 − 128 至 127 -128 ~ 至 ~ 127 −128 至 127将其变为移码来说就是 0 至 255 0至255 0至255,但是由于移码的全1和全0留用,也就是移码0和移码255被留用,实际的其真值的范围就变为 − 127 至 126 -127至126 −127至126,由于 留用了全0和全1,所以对于IEEE754标准求解移码的时候其移码的偏移是127,即是 2 7 − 1 2^7-1 27−1,而不再是 2 7 2^7 27。在双精度中同样留用全0和全1,所以其64位的双精度的移码偏移为 2 10 − 1 2^{10}-1 210−1,而不是 2 10 2^{10} 210。
如上图所示,定义了阶码全零或全1和尾数全零或全1,其表示的意思分别是啥,其实记忆起立很简单,全零就真的是零,之不过有正零和负零之分;全1,表示做大了,不可能再大了,就是无穷,也就是区分正无穷和负无穷。
- 对于阶码全0而尾数不为零来说,是非规格化的尾数,其实是为了提高精度的一种做法,这里可以理解以下。
- 对于阶码全1而尾数不为零来说,是非数。