6.1 无符号数和有符号数
6.1.1 无符号数
### 6.1.2 有符号数
-
把符号“数字化”的数称为机器数
-
把带“+”或“—“符号的数称为真值
6.1.2.1 原码表示法
-
又称为带符号的绝对值表示
6.1.2.1.1 整数的原码表示
$$
[x]_原 = \begin{cases} 0,x &2^n>x\geq 0\\[3ex] 2^n-x &0\geq x>-2^n \end{cases}\
$$
n不包含符号位
6.1.2.1.2 小数的原码表示
$$
[x]_原 = \begin{cases} 0,x &1>x\geq0\\[2ex] 2 - x &0\geq x>-1 \end{cases}
$$
简单的说,正数原码表示不变;负数为其绝对值的原码,最高位改为1
6.1.2.2 补码表示法
相当于取模同余
6.1.2.2.1 整数的补码表示
$$
[x]_补 = \begin{cases} 0,x &2^n>x\geq 0\\[3ex] 2^{n+1}+x &0\geq x>-2^n \end{cases}\
$$
6.1.2.2.2 小数的补码表示
$$
[x]_补 = \begin{cases} 0,x &1>x\geq0\\[2ex] 2 + x &0\geq x>-1 \end{cases}
$$
两位符号位的补码:
$$
[x]_补 = \begin{cases} 0,x &1>x\geq0\\[2ex] 4 + x &0\geq x>-1 \end{cases}
$$
正数同原码,负数为除符号位外,原码取反加一
-
模4补码具有模2补码的全部优点且更容易检查加减运算(不是乘除运算)中的溢出问题
-
存储模4补码仅需一个符号位
-
把两个模4补码的数送往ALU完成加减运算时,才把每个数的符号位的数值同时送到ALU双符号位中,即只在ALU中采用双符号位
-
采用双符号位时,第一符号位表示最终结果的符号,第二符号位表示结果是否溢出。
6.1.2.3 反码表示法
6.1.2.3.1 整数的反码表示
$$
[x]_反 = \begin{cases} 0,x &2^n>x\geq 0\\[3ex] \big(2^{n+1}-1\big)+x &0\geq x>-2^n \end{cases}\
$$
6.1.2.3.2 小数的反码表示
$$
[x]_补 = \begin{cases} 0,x &1>x\geq0\\[2ex] (2-2^{-n}) + x &0\geq x>-1 \end{cases}
$$
6.1.2.4 三种机器数的特点归纳
-
三种机器数的最高位均为符号位,符号位和数值之间用小数点或者逗号隔开
-
正数补码,原码,反码都相同。
-
当为负数时,反码为原码数值部分取反;补码为原码数值部分取反加一
6.1.2.5 移码表示法
用于比较大小
6.2.5.1 移码的表示
$$
[x]_移 = 2^n+x \quad\quad\big(2^n>x\geq -2^n\big)
$$
6.2 数的定点表示和浮点表示
6.2.1 定点表示
6.2.2 浮点表示
6.2.3 定点数和浮点数的比较
6.2.5 IEEE 754标准
6.3 定点运算
6.3.1 移位运算
6.3.1.1 算数移位(有符号数的移位)
真值 | 码制 | 添补代码 |
---|---|---|
正数 | 原码,补码,反码 | 0 |
负数 | 原码 | 0 |
负数 | 补码 | 左移添0 |
负数 | 补码 | 右移添1 |
负数 | 反码 | 1 |
6.3.1.2 逻辑移位(无符号数的移位)
-
逻辑左移,高位丢,低位添0
-
逻辑右移,地位丢,高位添0
6.3.1.2 循环移位
(a)不带进位的循环右移:操作数循环右移位,空出的高位部分由移出的低位部分来填充。同时,CF中只保存最后一次移出的那一位的内容
(b)带进位的循环右移:操作数连同CF位循环右移,用原CF的值填补空出的位,移出的位再进入CF。
(c)不带进位的循环左移:操作数循环左移位,空出的低位部分由移出的高位部分来填充。同时,CF中只保存最后一次移出的那一位的内容
(d)带进位的循环左移:操作数连同CF位循环左移,用原CF的值填补空出的位,移出的位再进入CF。
6.3.2.1 补码加减的基本公式
$$
&整数\quad[A]_补+[B]_补=[A+B]_补(mod2^{n+1})\\ &小数\quad[A]_补+[B]_补=[A+B]_补(mod2)
$$
6.3.2.2 溢出
溢出的定义:运算结果超出机器数所能表示的范围
-
用一位符号位判断溢出:实际参加操作的两个数符号相同,结果又与原操作数的符号不同,即为溢出
-
用两位符号位判断溢出:
-
两位符号位一起参加运算,而且高位产生的符号位自动丢失
-
当2位符号位不同时,表示溢出;否则,无溢出
-
当阶码用两位符号位表示时,判断溢出的原则与小数相同
-
符号位 | 结果 |
---|---|
00 | 表示结果为正数,无溢出 |
01 | 正溢出 |
10 | 负溢出 |
11 | 表示结果为负数,无溢出 |
-
采用一位符号位根据数据位的进位情况判断溢出
-
若符号位的进位C_s与最高数位的进位C_1相同,则说明没有溢出;否则表示发生溢出
-
6.3.3 乘法运算
6.3.3.1 原码乘法
6.3.3.1.1 原码一位乘
-
乘数的符号位由两原码符号位异或运算结果决定
-
乘数的数值部分由两数绝对值相乘
-
乘数为0,加0右移
-
乘数为1,加被乘数后右移
-
被乘数绝对值参与运算
-
部分积比其数值部分要多一位
-
其数值部分有n位,则进行n此加法,n次移位
开始0\toA\\被乘数(原码)\toX\\乘数(原码)\toQ\\n->C$$X_0\oplus Q_0 \to $$0\toX_0,0\toQ_0Q_n = 1?
6.3.3.1.2 原码两位乘
乘数y_{n-1}y_n | 标志位C_j | 操作内容 |
---|---|---|
00 | 0 | z\to2位,y^*\to2位,C_j保持“0” |
01 | 0 | z+x^*\to2位,y^*\to2位,C_j保持“0” |
10 | 0 | z+2x^*\to2位,y^*\to2位,C_j保持“0” |
11 | 0 | z-x^*\to2位,y^*\to2位,C_j保持“1” |
00 | 1 | z+x^*\to2位,y^*\to2位,C_j保持“0” |
01 | 1 | z+2x^*\to2位,y^*\to2位,C_j保持“0” |
10 | 1 | z-x^*\to2位,y^*\to2位,C_j保持“1” |
11 | 1 | z\to2位,y^*\to2位,C_j保持“1” |
6.3.3.2 补码乘法
6.3.3.2.1 Booth算法(补码比较法)
-
部分积位数比数值部分要多2位
-
[x]_补和[-x]_补参与运算
-
补码符号位参与运算
-
多一个附加位,首次默认位0
-
溢出直接舍掉
-
做多有n此移位,n+1次加法
-
补码一位乘附加位不参与结果
y_iy_{i+1} | y_{i+1}-y_i | 操作 |
---|---|---|
00 | 0 | 部分积右移移位 |
01 | 1 | 部分积加[x]_补,再左移一位 |
10 | -1 | 部分积加[-x]_补,再左移一位 |
11 | 0 | 部分积右移移位 |
6.3.4 除法运算
6.3.4.1 原码除法
6.3.4.1.1 恢复余数法
-
先商1,若相减为负,则加被除数,再商0,右移一位
-
若商1后,相减为正,则ok,右移一位
-
符号位为一位
-
[y^*]_原和[-y^*]_补参与运算
-
为左移,低位补0
-
余数为正商1,余数为负商0,不是看是否溢出
-
当商有N+1位时停止(N为数值部分的位数)
-
被除数一开始为其绝对值
6.3.4.1.2 加减交替法(补恢复余数法)
-
当R_i > 0,商上“1”,做2R_i-y^*的运算
-
当R_i < 0,商上“0”,做2R_i+y^*的运算
-
只有再最终结果为负数时,才需要恢复余数
6.3.4.2 补码除法
6.4 浮点四则运算
6.4.1 浮点加减运算
-
对阶:使两数的小数点位置对齐
-
尾数求和:将对阶后的两尾数按定点加减运算规则求和(差)
-
规格化:为增加有效数字的位数,提高运算精度,必须将求和(差)后的尾数规格化
-
舍入:为提高精度,要考虑尾数右移时丢失的数值位
-
溢出判断,即判断结果是否溢出
6.4.2 浮点数乘除法运算
-
乘积的阶码应为相乘两数的阶码之和,乘积的尾数应为相乘两数的尾数之积
-
商的阶码为被除数的阶码减去除数的阶码,尾数为被除数的尾数除以除数的尾数所得的商
6.4.2.1 阶码运算:
6.4.2.1.1 阶码加减方法
[j_x]_移+[j_y]_补 = 2^n+j_x+2^{n+1}+j_y = [j_x+j_y]_移
[j_x]_移 + [-j_y]_补 = [j_x-j_y]_移
6.4.2.1.2 判断溢出
再原有移码符号位的前面(即高位)再增加1位符号位,并规定该位恒用“0”表示,便能方便地进行溢出判断
溢出条件:运算结果移码的最高符号位为1,此时若低位符号位为0,表示上溢;低位符号位为1,表示下溢
若运算结果最高位为0,则没有溢出。若低位为1,则结果为正数,若低位为0则结果为负数
6.5算术逻辑运算单元
6.5.1 ALU电路
-
ALU电路已制成集成电路芯片,如74181
-
74181有两种工作方式,正逻辑和负逻辑
-
B_3~B_0和A_3~A_0是两个操作数,F_3~F_0为输出结果
-
C_{-1}表示最低位的外来进位,C_{n+4}是向高位的进位
-
P,G可供先行进位使用
-
M用于区别算术运算还是逻辑运算
-
74181的算术运算是用补码运算的
6.5.2 快速进位链
6.5.2.1 并行加法器
每位全加器的进位输出是高一位全加器的进位输入,因此当全加器有进位时,这种一级一级传递进位的过程将会大大影响运算速度
6.5.2.2 串行进位链
-
与非门的延迟时间为t_y
-
与或非门延迟时间为1.5t_y
6.5.2.3 并行进位链
并行进位链是指并行加法器中的进位信号是同时产生的,右称为先行进位,跳跃进位等
6.5.2.3.1 单重分组跳跃进位
将n位全加器分成若干小组,小组内的进位同时产生,小组与小组之间采用串行进位
-
经过10t_y便可产生全部进位(16位)
6.5.2.3.2 双重分组跳跃进位
将n位全加器分成若干大组,每个大组中又包含若干小组,而每个大组内所包含的各个小组的最高位进位是同时产生的大组与大组间采用串行进位
-
经过7.5t_y便可产生全部进位(16位)
6.6 类型转换
-
无扩展有符号数与无符号数之间的转换:符号位的意义改变
-
不同字长整数之间的转换
-
当大字长变量向小字长变量类型强制转换时,系统把多余的高位部分直接截短,低位直接赋值
-
当小字长向大字长变量类型强制转换时,使相应的位等值,对高位部分进行扩展
-
无符号数:进行零扩展,扩展后的高位部分用0填充
-
有符号数:符号扩展
-
-
本章考点
-
ALU是由组合逻辑电路构成的,最基本的部件是并行加法器。由于单纯的ALU不能够存储运算结果和中间变量,往往将ALU和寄存器或暂存器相连
-
ALU为运算器核心;数据总线供ALU与外界交互数据使用;溢出标志即为一个状态寄存器;地址寄存器不属于运算器,而属于存储器
-
并行加法器和并行进位不同。加法器可采用串行进位和并行进位的方式,相比于串行进位,并行进位可以大大提高加法器的运算速度
-
算术移位过程中符号位不变,空位进行相应规则的填补。 规则见此逻辑右移包括符号位
-
三种溢出判别方法,均须有溢出判别电路,可用“异或”门来实现
-
模4补码具有模2补码的全部优点且更容易检查加减运算(不是乘除运算)中的溢出问题
-
存储模4补码仅需一个符号位
-
把两个模4补码的数送往ALU完成加减运算时,才把每个数的符号位的数值同时送到ALU双符号位中,即只在ALU中采用双符号位
-
采用双符号位时,第一符号位表示最终结果的符号,第二符号位表示结果是否溢出。
-
其数值部分有n位,则进行n此加法,n次移位
-
补码不参加运算,不根据运算结果确定结果中的符号
-
乘积指的是相乘的结果
-
相乘要向右移N位,加上原先的N位,再加上符号位,有2N+1位
-
补码一位乘附加位不参与结果
-
原码的符号位,无论乘法还是除法,都是单独处理的
-
机器数用反码表示时,当机器数为负,左移时最高位数丢0,结果出错;右移时最低位丢0,影响精度
-
在算术移位的情况下,补码左移的前提条件是其原最高有效位与原码符号位要相同,否则会溢出
-
在算术移位的情况下,双符号位的移位操作只有低符号位需要参加移位操作
-
小端法:低位放在低地址
-
大端法:高位放在低地址
-
算术左右移符号位不参与,逻辑左右移符号位参与