写在开头:由于原、补码的乘除法运算在考试中一般只占 2 分,所以不想看完全可以跳过

# 奇偶校验码

奇校验码:整个校验码(有效信息和校验位)中 "1" 的个数为奇数

偶校验码:整个校验码(有效信息和校验位)中 "1" 的个数为偶数

  • 例:给出两个编码 1001101 和 1010111 的奇校验码和偶校验码
    • 设最高位为校验位,余 7 位是信息位,则对应的奇偶校验码为:
    • 奇校验:(1) 1001101 (0) 1010111
    • 偶校验:(0) 1001101 (1) 1010111
    • 若发生了 1bit 的数据发生错误,奇偶校验可以检测数错误位
    • 若发生了偶数个 bit 的数据发生错误,奇偶校验无法检测出错误
  • 偶校验的硬件实现:各信息进行异或运算,得到的结果位偶校验位,若结果为 1 说明出错

# 算数逻辑单元 (ALU)

算数运算:加、减、乘、除等

逻辑运算:与、或、非、异或等

辅助功能:移位、求补等

ALU

基本逻辑运算:与、或、非

优先级:与 > 或;与或符合分配律和结合律

本质上逻辑表达式是对电路的数学化描述,简化逻辑表达式就是简化电路

符合逻辑:与非、或非、异或、同或

# 一位全加器 (FA)

  • 输入:
    • AiA_iBiB_iCi1C_{i-1}(来自低位的进位),
  • 输出
    • SiS_i (本位的和):输入中有奇数个 1 时为 1,S_i=A_i\oplus B_i\oplus C_
    • CiC_i (向高位的进位):输入中至少两个 1,C_i=A_iB_i+(A_i\oplus B_i)C_

# 串行加法器

串行加法器:只有一个全加器,数据逐位串行送入加法器中进行运算。进位触发器用来寄存进位信号,以便参与下一次计算

如果操作数有 n 位,加法就要分 n 次进行,每一次产生一位和,并且串行逐位地送回寄存器

串行加法器

# 并行加法器:

串行进位的并行加法器:把 n 个全加器串接起来,就可以进行两个 n 位数的相加

串行进位并行加法器

串行进位又称为行波进位,每一级进位直接依赖于前一级进位,即进位值号是逐级形成的

并行进位的并行加法器:各级进位信号同时形成,又称为先行进位、同时进位

  • Ci=AiBi+(AiBi)(Ai1Bi1+(Ai1Bi1)(...))C_i=A_iB_i+(A_i\oplus B_i)(A_{i-1}B_{i-1}+(A_{i-1}\oplus B_{i-1})(...))
  • 逐级展开,直到C0C_0
  • 结论:第 i 位向更高位进位CiC_i 可根据被加数、加数的第 1~i 位,再结合C0C_0 即可确定

并行进位并行加法器

# 补码加减运算器

补码加减运算器

n bit 补码 X+Y,按位相加即可

n bit 补码 X-Y,将减数 Y 全部按位取反,末位 + 1,得到 [-Y] 补,减法变加法

无符号整数的加法 / 减法也可用该电路实现

# 原码的加减运算

原码的加法运算:

  • 正 + 正:绝对值做加法,结果为正(可能溢出)
  • 负 + 负:绝对值做加法,结果为负(可能溢出)
  • (正 + 负)/(负 + 正):绝对值大的减绝对值小的,符号同绝对值大的数

原码的减法运算:

  • 正 - 负:正 + 正
  • 负 - 正:负 + 负
  • 正 - 正:正 + 负
  • 负 - 负:负 + 正

# 补码的加减运算溢出判断

方法一:采用一位符号位

  • 设 A 的符号为ASA_S,B 的符号为BSB_S,运算结果的符号为SSS_S,则溢出的逻辑表达式为:V=ASBSASBSSSV=A_SB_S\overline{A_S}\overline{B_S}S_S

  • 若 V=0,表示无溢出

  • 若 V=1,表示有溢出

方法二:采用一位符号位

  • 根据数据进位判断溢出,最高数值位的进位C1C_1,符号位的进位为CSC_S
  • CSC_SC1C_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,移出的位舍弃

循环移位:

  • 不带进位:用移出的位补上空缺
  • 带进位:移出的位放到进位位,原进位位补上空缺

注意:由于原、反、补码位数有限,因此在某些时候算数移位不能精确等效乘法、除法

# 原码的乘法计算

原码的一位乘法:

  • 符号单独处理:符号位 =xsysx_s\oplus y_s

  • 数值位取绝对值进行乘法计算

  • 实现方法:先加法再移位,重复 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
    • 符号位单独处理:符号位 =xsysx_s\oplus y_s
    • 数值位取绝对值进行除法计算
    • 计算机先默认上商 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+2N余数的正负若最终余数为负,需恢复余数
补码加减交替法N+1N余数和除数是否同号商末位恒置 1

# C 语言类型转换

无符号数与有符号数:不改变数据内容,改变解释方式

长整数变短整数:高位截断,保留低位

短整数变长整数:符号扩展

# 数据的存储和排列

最低有效字节、最高有效字节:

4 字节 int:01 23 45 67 H(16 进制)

01 为最高有效字节(MSB),67 为最低有效字节(LSB)

大小端模式:

  • 大端模式(方便人类阅读):把最高有效字节存入更低地址,最低有效字节存入更高地址

  • 小端模式(便于机器处理):把最高有效字节存入更高地址,最低有效字节存入更低地址

现代计算机通常是按字节编址,即每个字节对应 1 个地址,通常也支持按字、按半字、按字节寻址。假设存储字长位 32 位,则 1 个字 = 32bit,半字 = 16bit。每次访存只能读 / 写 1 个字

边界对齐方式:访问一个字 / 半字都只需要一次访存

边界不对齐方式:访问一个字 / 半字可能需要两次访存