第二章根据书本【计算机组成原理(微课版) 】进行整理
计算机内部流动的信息可以分为两大类:
- 数据信息:计算机加工处理的对象
- 控制信息:用于控制数据信息的加工处理
数据信息的表示直接影响运算器的设计,进而影响计算机的结构和性能。
2.1 数据表示的作用
数据表示的作用是将数据按照某种方式组织起来,以便计算机硬件能直接识别和使用。
选择数据的表示方式需要考虑:
- 数据的类型
- 表示的范围和精度
- 存储和处理的代价
- 软件的可移植性
计算机采用二进制由于计算机的硬件所导致。
二进制由于数码最少、容易与简单的物理状态对应、算术逻辑运算电路更容易实现等优势用于计算机中数据的表示,采用二进制可以表示任何数据信息。
2.2 数值数据的表示
2.2.1 数的机器码表示
真值:
二进制数书写时用“+”和“-”表示数据的符号。
机器数(机器码):
采用二进制的0和1表示数据的符号,由符号和数值一起编码表示的二进制数。
1. 原码
原码:
将真值形式二进制数的“+”和“-”用0和1表示,正数符号位用0表示,负数符号位用1表示,数值位保持不变。
例如:
真值 | 原码 |
+1101 | 01101 |
-1111 | 11111 |
+0.1101 | 0.1101 |
-0.1111 | 1.1111 |
原码的优缺点:
- 优点:原码数据表示简单直观。
- 缺点:原码的加减法运算复杂,符号位不能直接参与运算,原码加法需要“同号求和,异号求差”,减法需要“异号求和,同号求差”。
原码在计算机中目前仅仅用于表示浮点数的尾码。
2. 反码
反码:
又称1的补码,其符号位与原码相同,真值为正数时,反码与原码相同;真值为负数时,反码数值位为真值数值位取反。
例如:
真值 | 反码 |
+1101 | 01101 |
-1111 | 10000 |
+0.1101 | 0.1101 |
-0.1111 | 1.0000 |
反码的缺点:反码与原码一样存在+0和-0两个0。
反码的符号位可以直接参与运算,加法运算直接反码相加,最高位进位要从运算结果最低位相加。
反码用于非数值型数据计算,现代计算机并没有采用反码进行数据表示和运算。
3. 补码
补码:
又称模2的补码 (模记作 mod 或 M)
补码求法:
- 正数:
与原码一样,符号位为0,数据位与真值相同 - 负数:
反码法:符号位为1,补码数据位等于真值数据位逐位取反,末位加1
扫描法:符号位为1,对真值数据位从右到左顺序扫描,右起第一个1及其右边的0保持不变,其余各位求反。
例如:
真值 | 补码 |
+1101 | 01101 |
-1111 | 10001 |
+0.1101 | 0.1101 |
-0.1111 | 1.0001 |
反码的优缺点:
- 优点:只有唯一的0,方便存储,减法运算可以转为加法运算
计算机中普遍采用补码表示有符号整数,浮点数中也有用补码表示。
4. 变形补码
变形补码(人用):
又称双符号补码、模4补码,采用两个二进制位表示数据的符号,其余与补码相同,符号位00表示正数,11表示负数。
变形补码相对于补码,多了一位一样的符号位
负数的变形补码数值位也可以使用反码法或扫描发进行求解
例如:
真值 | 补码 | 变形补码 |
+1101 | 01101 | 001101 |
-1111 | 10001 | 110001 |
+0.1101 | 0.1101 | 00.1101 |
-0.1111 | 1.0001 | 11.0001 |
变形补码运算溢出检测容易,运算时符号位最高位永远表示正确的符号位,符号位为01表示运算出现正溢出(只有两个正数相加溢出才会出现,如00,1 与 00,1 相加),符号位为10表示运算出现负溢出。
双符号补码主要人用,单符号补码主要机器用。
实际计算机由于成本问题主要采用单符号溢出检测方案。
5. 移码
移码只用于定点整数的表示,通常用于表示浮点数的阶码(移码的作用)。
移码的求法:
移码和补码的符号位相反,数值位相同,正数的移码符号位为1,负数的移码符号位为0。所以求移码可以先求出补码,再更改补码的符号位就可求得移码。
移码保持了真值数据的大小顺序,移码可以直接比较大小,为浮点运算的対阶操作带来方便。对于补码、原码、反码的正数符号位为0,负数符号位为1,如果连带符号位(符号位也看作数值中的一部分)将数值转为十进制,负数会大于正数;而移码由于符号位与之相反,所以移码的大小顺序与真值数据的大小顺序一样。
移码的特点:
- 移码的符号位中0表示负数,1表示正数
- 同一数值的移码和补码除符号位相反外,其他各位相同
- 移码中0的表示也唯一,具体表示为10000…0
从图中我们可以得出以下结论:
- (1) 原码、反码的表示区间在数轴上是对称的,二者都存在+0和-0两个0。
- (2) 补码、移码的表示区间在数轴上是不对称的,0的表示是唯一的,它们相对原码和反码在数轴最左侧多表示了一个数。
- (3) 原码、反码、补码的符号位相同,正数的机器码相同。
- (4) 整数的补码、移码的符号位相反,数值位相同。
- (5) 负数的反码、补码末位相差1。
- (6) 原码很容易判断大小,而负数的反码、补码很难直接判断大小,可以采用如下规则进行快速判断: 数值部分越大,真值越大(更靠近0),绝对值越小。补码最大负数为全1,编码为1111,真值为-1;最小负数为1000,真值为-8。
- (7) 移码保持了原有大小顺序,可以直接比较大小,这也是移码最大的优势。全0的移码0000是最小数-8,全1的移码1111的移码是最大数+7。
2.2.2 定点数表示
定点数表示法:
约定计算机中所有数据的小数点位置固定,将小数点的位置固定在数据的最高数位之前(或符号位之后)的数据表示称为定点小数,将小数点固定在最低数位之后的数据表示称为定点整数。
由于小数点位置固定,因此小数点不必再用符号表示,其位置也无需存储。
1. 定点小数
定点小数补码表示的数据范围:-1 ≤ x ≤ 1-2(-n)
定点小数主要用于表示浮点数的尾数
2. 定点整数
定点整数补码表示的数据范围:-2(n) ≤ x ≤ 2(n)-1
3. 定点数能表示的范围
定点数能表示的数据范围与下列因素有关:
- 机器字长,字长越长,能表示的数据范围越大
- 所采用的机器数表示方法,补码和移码能表示的数据范围比原码和反码多一个数
定点数的数据表示范围与机器字长以及机器码有关
当数据超出计算机所能表示的数据范围时称为溢出,当数据大于最大正数时,发生正上溢;当数据小于最小负数时,发生负下溢。
定点小数存在精度问题,所有不在数轴上的纯小数都超出了定点小数能表示的精度,无法表示,此时定点小数发生精度溢出,只能采用舍入的方式近似表示。
2.2.3 浮点数表示
当数的表示范围超出了定点数范围使用浮点数。
类似科学计数法, 浮点数尾数规格化后表示的形式唯一。
1. 浮点数的表示形式
浮点数中小数点的位置并不固定,即小数点的位置可以浮动。
为了扩大浮点数的表示范围和提高浮点数的精度,二进制浮点数表示采用了类似十进制科学计数法的表示方法,任意一个二进制数 N 都可以表示成如下形式:
N = 2E * M = 2±e * (±0.m)
采用这种方法,二进制浮点数可以表示成阶码 E 和尾数 M 两部分,其中阶码 E 是定点整数,尾数 M 是定点小数。阶码的位数决定数据表示的范围(反映数据的大小),阶码的位数越多能表示的数据范围越大,阶码的值决定了小数点的位置;尾数的位数决定数据表示的精度。
阶码长度相同时,分配给尾数的数位越多,数据表示的精度越高。
浮点数数据的一般格式:
注意:
阶码和尾数可以采用不同的机器码进行表示。
阶码常用补码或移码表示的定点整数,位数常用原码或补码表示的定点小数。
例如:
X = 2-01 * (-0.1110)
用8位浮点数数据格式进行表示,阶码占3位,尾数5位(都采用补码),其中最高位为符号位。
1 11, 1 0010
阶符 | 阶值 | 数符 | 尾数 |
1 | 11 | 1 | 0010 |
2. 浮点数表示范围
当阶码为最大值,尾数为最大值时,浮点数为正数最大值;当阶码为最小值,尾数为正数最小值时,浮点数为正数最小值,这个值也就是浮点数的最小精度。
当阶码为最大值,尾数为最小负数时,浮点数为负数最小值;当阶码为最小值,尾数为负数最大值时,浮点数为负数最大值。
浮点数有效扩大了数据表示范围,但受计算机字长限制,浮点数仍然存在溢出现象。
上图为浮点数的有效表示范围,图中“负数区域” “正数区域” 及 “0” 是可表示的数据区域。
当浮点数绝对值超过正数最大值时,发生上溢,左、右两侧对应正上溢和负上溢,分别表示正无穷和负无穷;当非0浮点数绝对值小于正数最小值时,发生下溢。
若运算结果发生上溢,浮点运算器件会显示溢出标志,若运算结果发生下溢,虽然数据不能精确表示,但由于发生下溢时数的绝对值很小,可作为机器0处理。
当一个浮点数在正、负数区域中但并不在某个数轴刻度上,也会出现精度溢出,此时只能用近似数表示。
浮点数表示范围由阶码决定,精度由尾数决定。
3. 浮点数的规格化
浮点数尾数小数点的位置不同,会有不同的尾数和阶码组合。
要使浮点数的表示形式唯一并进一步提高数据的表示精度,需要对浮点数进行尾数的规格化处理。
规格化处理:
使得尾数真值最高有效位为1,即尾数的绝对值应大于或等于(0.1)2或(0.5)10。
规格化处理后尾数的形式为:
0.1xxxxxx 或 1.0xxxxx • 1
对于非规格化尾数,需要对齐进行规格化操作。根据具体形式将非规格化的尾数进行算术左移或右移,同时减少或增加阶码值,对于的规格化方法分别称为左移规格化(数字向左移)和右移规格化(数字向右移)。(左移和右移,移数不移动小数点)
结果溢出,进行右规;没有溢出,进行左规,直到尾数最高位与符号位相反
需要左规的情况:00.0xxx或11.1xxx
需要右规的情况:01.xxx或10.xxx
浮点数是否溢出,看规格化后的阶码。
原码表示尾数,数值最高位为1 => 正数:0.1xxxx;负数:1.1xxxx
补码表示尾数,数值最高位为1 => 正数:0.1xxxx;负数:1.0xxxx (规格化是真值最高有效位为1,而真值的补码会进行取反)
移码只能用于表示整数,阶码可以使用移码表示。
移码的定义:移码 = 真值 + 偏置值
偏置值一般取2(n-1)
4. IEEE754 浮点数标准
对于同一浮点数编码,如果阶码和尾数位数的划分不同,或阶码和尾数被看成不同的机器数,其对应的浮点数真值就可能不同,这影响了软件的可移植性。
IEEE754 标准主要包括32位单精度浮点数和64位双精度浮点数,分别对应C语言中的float型和double型数据。
5. IEEE754 单精度浮点数
IEEE754 标准中所有二进制浮点数都由符号位S、阶码E、尾数M三部分组成,不同精度的二进制浮点数的阶码、尾数位宽均不相同,阶码所采用的移码偏移量也不同。
32位单精度浮点数的具体形式如下:
其中,符号位1位,阶码8位,尾数32位。
- 阶码E采用移码表示,注意其偏移量为127而不是标准移码的128。偏移量越大,移码最大值、最小值越小,非规格化数的精度越高;规格化数表示范围越小。采用127偏移量的最主要原因是使得任何一个规格化数的倒数能用另一个浮点数表示,采用128偏移量表示的最小规格化数的倒数会发生溢出。
- 尾数M为定点小数,小数点固定在M的最左侧,且小数点左边还有一个隐藏的1,因此尾数的实际有效位为24位,完整的尾数形式为1.M,进行浮点数表示时只保存M,节省的比特位可以用于提高尾数的精度。尾数部分是绝对值表示,尾数的符号也就是浮点数的符号位S,1表示负数,0表示正数,所以浮点数的尾数可以看作原码表示。规格化后M为1.xxxx。
- S、E、M字段的取值不同,则表示的浮点数不同
阶码全1、全0用作特殊用途,阶码的范围. - 阶码E为255时浮点数可以表示无穷大或非数NaN
- 阶码和尾数均为0时,表示机器0
当阶码 1≤E≤254 时,浮点数为规格化数,规格化公式为:
N = (-1)s * 2E-127 * 1.M
当阶码 E=0 且 M≠0时,浮点数为非规格化数,非规格化数公式为:
N = (-1)s * 2-126 * 0.M
当阶码 E=0 且 M≠0,表示非规格化数 ±(0.xxx)2 * 2-126
当 E=0 且 M=0,表示真值±0
当阶码全为1,M=0,表示无穷大 ±∞
当阶码全为1,M≠0,表示非数值NaN
阶码越长,表示范围越大,精度越高(规格化);阶码相同,尾数越长,数据的精度越高。
浮点数扩大了表示范围,为增加表示个数,绝对值越大,浮点数越稀疏,浮点数是离散空间。由于IEEE754浮点数采用阶码和尾数的形式表示浮点数,因此浮点数在数轴上的刻度
分布并不像定点数一样是均匀的,下图所示是单精度浮点数在数轴上的刻度分布,0右边阴影区是非规格化数区域,越往右浮点数的分布越稀疏。
浮点数运算不满足结合律,浮点数密度变化导致小数和大数相加时小数可能会被“吸收”,这个特性导致浮点数的加法运算不满足结合律。
[-B]补 = [ [B]补 ]补
6. 单精度浮点数与真值之间的转换流程
IEEE754中32位浮点数与对应真值之间转换流程:
例题:
浮点数加减:
- 先対阶,使得阶数一样(通过尾数移动)
- 尾数相加减,规格化