写在开头:由于原、补码的乘除法运算在考试中一般只占 2 分,所以不想看完全可以跳过
# 奇偶校验码
奇校验码:整个校验码(有效信息和校验位)中 "1" 的个数为奇数
偶校验码:整个校验码(有效信息和校验位)中 "1" 的个数为偶数
- 例:给出两个编码 1001101 和 1010111 的奇校验码和偶校验码
- 设最高位为校验位,余 7 位是信息位,则对应的奇偶校验码为:
- 奇校验:(1) 1001101 (0) 1010111
- 偶校验:(0) 1001101 (1) 1010111
- 若发生了 1bit 的数据发生错误,奇偶校验可以检测数错误位
- 若发生了偶数个 bit 的数据发生错误,奇偶校验无法检测出错误
- 偶校验的硬件实现:各信息进行异或运算,得到的结果位偶校验位,若结果为 1 说明出错
# 算数逻辑单元 (ALU)
算数运算:加、减、乘、除等
逻辑运算:与、或、非、异或等
辅助功能:移位、求补等
基本逻辑运算:与、或、非
优先级:与 > 或;与或符合分配律和结合律
本质上逻辑表达式是对电路的数学化描述,简化逻辑表达式就是简化电路
符合逻辑:与非、或非、异或、同或
# 一位全加器 (FA)
- 输入:
- ,,(来自低位的进位),
- 输出
- (本位的和):输入中有奇数个 1 时为 1,S_i=A_i\oplus B_i\oplus C_
- (向高位的进位):输入中至少两个 1,C_i=A_iB_i+(A_i\oplus B_i)C_
# 串行加法器
串行加法器:只有一个全加器,数据逐位串行送入加法器中进行运算。进位触发器用来寄存进位信号,以便参与下一次计算
如果操作数有 n 位,加法就要分 n 次进行,每一次产生一位和,并且串行逐位地送回寄存器
# 并行加法器:
串行进位的并行加法器:把 n 个全加器串接起来,就可以进行两个 n 位数的相加
串行进位又称为行波进位,每一级进位直接依赖于前一级进位,即进位值号是逐级形成的
并行进位的并行加法器:各级进位信号同时形成,又称为先行进位、同时进位
- 逐级展开,直到
- 结论:第 i 位向更高位进位 可根据被加数、加数的第 1~i 位,再结合 即可确定
# 补码加减运算器
n bit 补码 X+Y,按位相加即可
n bit 补码 X-Y,将减数 Y 全部按位取反,末位 + 1,得到 [-Y] 补,减法变加法
无符号整数的加法 / 减法也可用该电路实现
# 原码的加减运算
原码的加法运算:
- 正 + 正:绝对值做加法,结果为正(可能溢出)
- 负 + 负:绝对值做加法,结果为负(可能溢出)
- (正 + 负)/(负 + 正):绝对值大的减绝对值小的,符号同绝对值大的数
原码的减法运算:
- 正 - 负:正 + 正
- 负 - 正:负 + 负
- 正 - 正:正 + 负
- 负 - 负:负 + 正
# 补码的加减运算溢出判断
方法一:采用一位符号位
设 A 的符号为,B 的符号为,运算结果的符号为,则溢出的逻辑表达式为:
若 V=0,表示无溢出
若 V=1,表示有溢出
方法二:采用一位符号位
- 根据数据进位判断溢出,最高数值位的进位,符号位的进位为
- 当 与 不同时,则有溢出
方法三:采用双符号位
正数符号为 00,负数符号为 11,若两个符号位的两个数字不同,则说明有溢出,反之,则没有溢出
双符号位补码又称:模 4 补码,单符号位补码又称:模 2 补码
双符号位在实际存储时只存储 1 个符号位,运算时会复制一个符号位
# 符号扩展
定点整数的符号扩展:
- 在原符号位和数值位中间添加新位,正数都添 0,负数原码添 0,负数反、补码添 1
定点小数的符号扩展:
- 在原符号位和数值位后面添加新位,正数都添 0,负数原、补码添 0,负数反码添 1
# 标志位的生成
OF:溢出标志,溢出时为 1,否则置 0
- 硬件的计算方法:OF = 最高位产生的进位异或次高位产生的进位
SF:符号标志,结果为负时为 1,否则置 0
- 硬件的计算方法:最高位的本位和
ZF:零标志,运算结果为 0 时,ZF 为 1,否则置 0
- 硬件的计算方法:两个数的运算结果为 nbit,只有 n bit 全为 0 时,ZF=1
CF:进位 / 借位标志,进位 / 错位时置 1,否则置 0
- 硬件的计算方法:CF = 最高位产生的进位异或 sub(sub=0 表示加法,sub=1 表示减法)
OF、SF 仅对有符号数加减法有效,ZCF 仅对无符号数加减法有效
# 移位
移位:通过改变各个数码和小数点的相对位置,从而改变各数码位的位权。可用移位运算实现乘法、除法
原码的算数移位:符号位保持不变,仅对数值位进行移位
右移:高位补 0,低位舍弃。若舍弃的位 = 0,则相当于除 2,若舍弃的位不等于 0,则会丢失精度
左移:低位补 0,高位舍弃。若舍弃的位 = 0,则相当于乘 2,若舍弃的位不等于 0,则会出现严重误差
反码的算数移位:
- 正数的反码与原码相同,因此对正数反码的移位运算也与原码相同
- 负数的反码数值位于原码相反
- 右移:高位补 1,低位舍弃
- 左移:低位补 1,高位舍弃
补码的算数移位:
- 正数的补码与原码相同,因此对正数反码的移位运算也与原码相同
- 负数补码 = 反码末位 + 1,导致反码最右边几个连续的 1 都因进位而变 0,直到第一个 0 为止
- 规律 —— 负数补码中,最右边的 1 及其右边同原码。最右边的 1 的左边同反码
- 右移(同反码)—— 高位补 1,低位舍弃
- 左移(同原码)—— 低位补 0,高位舍弃
逻辑移位:左移、右移都补 0,移出的位舍弃
循环移位:
- 不带进位:用移出的位补上空缺
- 带进位:移出的位放到进位位,原进位位补上空缺
注意:由于原、反、补码位数有限,因此在某些时候算数移位不能精确等效乘法、除法
# 原码的乘法计算
原码的一位乘法:
符号单独处理:符号位 =
数值位取绝对值进行乘法计算
实现方法:先加法再移位,重复 n 次(移位为逻辑移位)
每次加法可能 + 0,+[|x|] 原(根据当前 MQ 中的最低位来确定加什么)
- MQ 中最低位 = 1 时,(ACC)+[|x|] 原
- MQ 中最低位 = 0 时,(ACC)+0
# 补码的乘法计算
补码的一位乘法:
进行 n 轮加法、移位,最后再多来一次加法
每次加法可能 + 0,+[x] 补,+[-x] 补(根据当前 MQ 中的最低位、辅助位来确定加什么)
- 辅助位 - MQ 中最低位 = 1 时,(ACC)+[x] 补
- 辅助位 - MQ 中最低位 = 0 时,(ACC)+0
- 辅助位 - MQ 中最低位 =-1 时,(ACC)+[-x] 补
每次右移为补码的算数右移
符号位参与运算
辅助位初始为 0。每次右移会使 MQ 的最低位顶替原本的辅助位(事实上 MQ 共 n+2 位)
所有寄存器都统一用 n+2 位,因此采用双符号位补码运算
# 原码的除法运算
规律:忽略小数点,每确定一位商,进行一次减法,得到 4 位余数,在余数末尾补 0,再确定下一位商。确定 5 位商即可停止(机器字长为 5 位)
恢复余数法:
- 实现方法:上商 0/1,得到余数,余数末尾补 0
- 符号位单独处理:符号位 =
- 数值位取绝对值进行除法计算
- 计算机先默认上商 1,求余数:(ACC)-(除数)->ACC,若得到的相减结果(ACC+[-|y|] 补 ->ACC)为负数,则改上商 0,并恢复余数(ACC+[|y|] 补 ->ACC)
- ACC、MQ 整体逻辑左移,ACC 高位丢弃,MQ 低位补 0
加减交替法:
- 若余数为负,则可直接商 0,让余数逻辑左移一位再加上 | 除数 | 得到下一个新余数
- 若余数为正,则商 1,让余数左移 1 位再减去 | 除数 |,得到下一个新余数
- 符号位也需要单独处理
- 若最后得到的余数为负,则需商 0,并 +[|y|] 补得到正确余数
# 补码的除法运算
- 符号位参与计算
- 被除数 / 余数、除数采用双符号位
加减交替法:
被除数和除数同号,则被除数减去除数;异号则加上除数
余数和除数同号,商 1,余数左移一位减去除数
余数和除数异号,商 0,余数左移一位加上除数
重复 n 次
但最后结果末位恒置为 1
除法类型 | 符号位参与运算 | 加减次数 | 移位 | 上商、加减原则 | 说明 | |
---|---|---|---|---|---|---|
方向 | 次数 | |||||
原码加减交替法 | 否 | N+1 或 N+2 | 左 | N | 余数的正负 | 若最终余数为负,需恢复余数 |
补码加减交替法 | 是 | N+1 | 左 | N | 余数和除数是否同号 | 商末位恒置 1 |
# C 语言类型转换
无符号数与有符号数:不改变数据内容,改变解释方式
长整数变短整数:高位截断,保留低位
短整数变长整数:符号扩展
# 数据的存储和排列
最低有效字节、最高有效字节:
4 字节 int:01 23 45 67 H(16 进制)
01 为最高有效字节(MSB),67 为最低有效字节(LSB)
大小端模式:
大端模式(方便人类阅读):把最高有效字节存入更低地址,最低有效字节存入更高地址
小端模式(便于机器处理):把最高有效字节存入更高地址,最低有效字节存入更低地址
现代计算机通常是按字节编址,即每个字节对应 1 个地址,通常也支持按字、按半字、按字节寻址。假设存储字长位 32 位,则 1 个字 = 32bit,半字 = 16bit。每次访存只能读 / 写 1 个字
边界对齐方式:访问一个字 / 半字都只需要一次访存
边界不对齐方式:访问一个字 / 半字可能需要两次访存