考研 | 组成原理【第二章】数据的表示和运算

考研 | 组成原理【第二章】数据的表示和运算

I. 数制与编码

a. 进位计数制及其相互转换

  1. 整数部份十进制转二进制: 留意高低位排序
    在这里插入图片描述
  2. 小数部分十进制转二进制: 留意高地位排序在这里插入图片描述

b. BCD码

BCD码: 就是 Binary-Coded Decimal, 即二进制编码的十进制数

1. 8421码

8421码: 就是对于 0~9 每个数字用 4 位二进制数来进行一一表示;其中 8421 码也叫有权码,从左往右数,第一个 1 权值为 8 ;第二个 1 权值为 4;第三个 1 权值为 2;第四个 1 权值为 1;
在这里插入图片描述

十进制 5 + 8 = 1 3
二进制 0101 + 1000 = 0001 0011

2. 余3码

余3码: 属于无权码,它是在 8421码 的基础上,每位加 ( 3 ) 10 (3)_{10} (3)10,即二进制 ( 0011 ) 2 (0011)_2 (0011)2
在这里插入图片描述

3. 2421码

2421码: 同 8421码,都属于有权码,但是与 8421码 不同,从右往左数,每个 1 的权值分别为 2421
在这里插入图片描述
 

c. 无符号整数表示和运算

1. 表示

在这里插入图片描述

  1. 全部二进制位都是数值位, 没有符号位, 第 i i i 位的位权是 2 i − 1 2^{i-1} 2i1
  2. n n n bit无符号整数表示范围 0 ∼ 2 n − 1 0\sim2^{n}-1 02n1, 超出则溢出
  3. 最小数是全 0; 最大数是全 1

2. 运算

  1. 加法: 从 最低位 开始, 按位相加, 并往更高位进位
  2. 减法:
    1. “被减数” 不变, “减数” 全部位按位取反, 末位+1(即变补码), 减法变加法
    2. 从 最低位 开始, 按位相加, 并往 更高位 进位.
       

d. 带符号整数的表示和运算

1. 原码

对于 n + 1 n+1 n+1 位机器字长:

  1. 最高位为符号位, “0/1” 对应 “正负”; 剩余位数为数值位, 表示真值的绝对值
  2. 表示范围 − ( 2 n − 1 ) ≤ x ≤ 2 n − 1 -(2^n-1) \leq x \leq 2^n-1 (2n1)x2n1
  3. 真值 0两种形式, [ + 0 ] 原 = 0 , 00000000 ; [ − 0 ] 原 = 1 , 00000000 [+0]_原=0,00000000; [-0]_原=1,00000000 [+0]=0,00000000;[0]=1,00000000

缺点: 符号位不能参与运算, 需要设计复杂的硬件电路才能处理
在这里插入图片描述

2. 反码

在 原码 的基础上: 正数不变; 负数 符号位不变数值位取反
在这里插入图片描述

3. 补码

  1. 机器的方式: 原 → 反 → 补 (反码转补码: 正数不变, 负数末位+1)
    在这里插入图片描述

  2. 人工手算的方式: 原 → 补
    正数不变; 负数从右往左找到第一个1,这个1左边的所有数值位按位取反;
    补码 转 原码 也是这种方式, 正数不变, 负数从右往左找到第一个 1, 这个 1 左边的所有数值位按位取反
    在这里插入图片描述

  3. 这里记录一个我自己总结的直接从负数补码算真值的方法:
    见上图右下角 蓝色部分

    1. 从右往左找到第一个1
    2. 这个 1 左边的所有 0 对应的二进制权值 + 这个 1 对应的二进制权值 = 真值
  4. 补码加法: 从最低位开始, 按位相加(包括符号位), 并往更高位进位

  5. 补码减法:

    1. “被减数” 不变, “减数” 全部按位取反(包括符号位)末位+1
    2. 减法变加法, 从最低位开始, 按位相加, 并往更高位进位

4. 移码

移码: 在补码的基础上, 符号位取反; 注意: 只能表示正数
在这里插入图片描述

5. 原反补移码特性对比

  1. 转换关系:
    在这里插入图片描述

  2. 表示范围:
    在这里插入图片描述

  3. 用几种码来表示整数:
    在这里插入图片描述

e. 定点小数的表示和运算

1. 定点小数 v.s. 定点整数

注意: 定点小数第一位是符号位, 即小数点前一位; 定点小数不能用移码表示
在这里插入图片描述

2. 定点小数的加法运算

同定点整数加法: 从最低位开始, 按位相加(包括符号位), 并往更高位进位;
在这里插入图片描述

3. 定点小数的减法运算

同定点整数减法: "被减数"不变, 全部位按位取反, 末位+1, 减法变加法
在这里插入图片描述


II. 运算方法和运算电路

a. 基本运算部件

1. 逻辑运算

  • 与 | 或 | 非
    在这里插入图片描述

  • 与非 | 或非 | 异非 | 同或
    在这里插入图片描述

  • 用 与或非 组合实现异或门
    在这里插入图片描述

  • 简化逻辑表达式

    • 优先级: 与 > 或
    • 分配律: A ( C + D ) = A C + A D A(C+D)=AC+AD A(C+D)=AC+AD
    • 结合律: A B C = A ( B C ) ABC=A(BC) ABC=A(BC); A + B + C = A + ( B + C ) A+B+C=A+(B+C) A+B+C=A+(B+C)
    • 反演律: A + B ‾ = A ‾ ⋅ B ‾ \overline{A+B}=\overline{A}\cdot\overline{B} A+B=AB; A ⋅ B ‾ = A ‾ + B ‾ \overline{A\cdot B}=\overline{A}+\overline{B} AB=A+B

2. 一位全加器

一位全加器实现的功能是 一个二进制位 上的加法, 不仅要结合当前两个加数的二进制位, 还要结合从前一个二进制位带上来的 进位.

  • 加法结果 S i S_i Si: 看输入(两个加数的二进制位, 前一位的进位) 中有偶数个 1 还是 奇数个 1
    S i = A i ⊕ B i ⊕ C i − 1 S_i = A_i \oplus B_i \oplus C_{i-1} Si=AiBiCi1
  • 向高位的进位 C i C_i Ci: 如果输入中至少有两个 1, 进位就是 1
    C i = A i B i + ( A i ⊕ B i ) C i − 1 C_i = A_iB_i+(A_i\oplus B_i)C_{i-1} Ci=AiBi+(AiBi)Ci1
    第一项代表的是 两个加数的二进制位 都是1
    第二项代表两个本位中只有一个 1 , 且来自低位的进位是 1

用逻辑电路图表示:

3. 串行加法器

串行加法器: 只由一个 一位全加器 构成, 两个加数 按位 一个一个二进制位送入 全加器 里面进行运算, 这种就是 串行. 如果操作数长 n n n 位, 加法器就要进行 n n n 次运算.

4. 串行进位的并行加法器

串行进位的并行加法器: 把 n n n 个 全加器 串连起来, 就可以得到两个 n n n 位二进制数相加的结果
在这里插入图片描述
从图中看得出来, 缺点很明显, 由于每一级的输入除了两个加数自身的二进制数以外, 还要包括上一位的进位, 因此每一级的加法都得依赖上一级.

5. 并行进位的并行加法器

并行进位的并行加法器 其实就是在 串行的基础上耍了一些trick. 前面提到, 由于受限于每一级的进位 C i − 1 C_{i-1} Ci1, 因此我们对 C i C_{i} Ci 进行展开:
C i = A i B i + ( A i ⊕ B i ) C i − 1 C i = A i B i + ( A i ⊕ B i ) ( A i − 1 B i − 1 + ( A i − 1 ⊕ B i − 1 ) C i − 2 ) C i = A i B i + ( A i ⊕ B i ) ( A i − 1 B i − 1 + ( A i − 1 ⊕ B i − 1 ) ( A i − 2 B i − 2 + ( A i − 2 ⊕ B i − 2 ) C i − 3 ) ) \begin{aligned} &C_{i}=A_{i} B_{i}+\left(A_{i} \oplus B_{i}\right) C_{i-1} \\ &C_{i}=A_{i} B_{i}+\left(A_{i} \oplus B_{i}\right)\left(A_{i-1} B_{i-1}+\left(A_{i-1} \oplus B_{i-1}\right) C_{i-2}\right) \\ &C_{i}=A_{i} B_{i}+\left(A_{i} \oplus B_{i}\right)\left(A_{i-1} B_{i-1}+\left(A_{i-1} \oplus B_{i-1}\right)\left(A_{i-2} B_{i-2}+\left(A_{i-2} \oplus B_{i-2}\right) C_{i-3}\right)\right) \end{aligned} Ci=AiBi+(AiBi)Ci1Ci=AiBi+(AiBi)(Ai1Bi1+(Ai1Bi1)Ci2)Ci=AiBi+(AiBi)(Ai1Bi1+(Ai1Bi1)(Ai2Bi2+(Ai2Bi2)Ci3))
当展开到 C 0 C_0 C0 的时候, 整体的 C i C_i Ci 就可以直接确定, 因为每一位的 A i A_i Ai B i B_i Bi 都已经, C i C_i Ci 也已知, 那么就可以直接算得任意一步的进位 C i C_i Ci
我们再让 G i = A i B i G_i=A_iB_i Gi=AiBi P i = A i ⊕ B i P_i=A_i\oplus B_i Pi=AiBi
C i = A i B i + ( A i ⊕ B i ) C i − 1 = G i + P i C i − 1 C 1 = G 1 + P 1 C 0 C 2 = G 2 + P 2 C 1 = G 2 + P 2 G 1 + P 2 P 1 C 0 C 3 = G 3 + P 3 C 2 = G 3 + P 3 G 2 + P 3 P 2 G 1 + P 3 P 2 P 1 C 0 C 4 = G 4 + P 4 C 3 = G 4 + P 4 G 3 + P 4 P 3 G 2 + P 4 P 3 P 2 G 1 + P 4 P 3 P 2 P 1 C 0 \begin{aligned} &C_{i}=A_{i} B_{i}+\left(A_{i} \oplus B_{i}\right) C_{i-1}=G_{i}+P_{i} C_{i-1} \\ &C_{1}=G_{1}+P_{1} C_{0} \\ &C_{2}=G_{2}+P_{2} C_{1}=G_{2}+P_{2} G_{1}+P_{2} P_{1} C_{0} \\ &C_{3}=G_{3}+P_{3} C_{2}=G_{3}+P_{3} G_{2}+P_{3} P_{2} G_{1}+P_{3} P_{2} P_{1} C_{0} \\ &C_{4}=G_{4}+P_{4} C_{3}=G_{4}+P_{4} G_{3}+P_{4} P_{3} G_{2}+P_{4} P_{3} P_{2} G_{1}+P_{4} P_{3} P_{2} P_{1} C_{0} \end{aligned} Ci=AiBi+(AiBi)Ci1=Gi+PiCi1C1=G1+P1C0C2=G2+P2C1=G2+P2G1+P2P1C0C3=G3+P3C2=G3+P3G2+P3P2G1+P3P2P1C0C4=G4+P4C3=G4+P4G3+P4P3G2+P4P3P2G1+P4P3P2P1C0
画成电路图:
在这里插入图片描述

6. 补码加减法器

  1. XY分别对应两个加数或者被减数和减数
  2. 设置 s u b sub sub, 如果是减法就设置为 1, 如果是加法设置为 0
  3. s u b sub sub 为0, 即加法的时候, Y 直接通过 多路选择器 进入加法器
  4. s u b sub sub 为1:
    1. Y 会先经过 非门, 对Y上的所有位进行按位取反
    2. 同时, s u b sub sub 作为 1, 也会作为 C i − 1 C_{i-1} Ci1 传进加法器中
    3. 对 Y 所有位按位取反再 +1, 即可完成 X-Y 到 X+(-Y) 的操作
      在这里插入图片描述

7. 标志位生成

在这里插入图片描述
在这里插入图片描述

b. 定点数的移位运算

1. 算数移位

在这里插入图片描述

2. 逻辑移位

  • 逻辑右移: 高位补0, 低位舍弃
  • 逻辑左移: 低位补0, 高位舍弃

3. 循环移位

在这里插入图片描述

c. 定点小数的乘法运算

1. 原码乘法运算

  • 符号位单独处理, 符号位 = x s ⊕ y s =x_s\oplus y_s =xsys
  • 数值位取绝对值进行乘法运算:
  1. 先回顾几个运算器的构件:
    在这里插入图片描述
  2. 我们现在要计算: [ x ] 原 = 1.1101 , [ y ] 原 = 0.1011 , x ⋅ y [x]_原=1.1101, [y]_原=0.1011, x\cdot y [x]=1.1101,[y]=0.1011,xy
  3. 先将被乘数, 即 x, 符号位变成 0, 取绝对值, 放进 通用寄存器 X X X
    乘数, 即 y, 符号位也同样取 0, 取绝对值, 放进 乘商寄存器 M Q MQ MQ
    累加器 A C C ACC ACC 全置 0;
    在这里插入图片描述
  4. 从右往左看 乘商寄存器 M Q MQ MQ, 第一个是 1 1 1
    那么我们就往 累加器 A C C ACC ACC 里加上 通用寄存器 X X X 里的 被乘数 X X X
    然后 累加器 A C C ACC ACC 和 乘商寄存器 M Q MQ MQ 一起 逻辑右移: 高位补 0 0 0, 低位舍弃
  5. 然后重复第四步, 还是 1 1 1, 于是我们对 累加器 A C C ACC ACC 先加 通用寄存器 X X X 里的被乘数, 然后 A C C ACC ACC M Q MQ MQ 一起逻辑右移:
  6. 继续重复第四步, 但是这一次是 0 0 0, 如果遇到 0 0 0, 累加器 A C C ACC ACC 就什么都不加, 直接和 乘商寄存器 M Q MQ MQ 逻辑右移
  7. 一直重复第四步, 直到原本放 乘数 的 乘商寄存器 M Q MQ MQ 里的符号位移到最后一个位, 就可以停止了
    这个时候, 还需要把 累加器 A C C ACC ACC 的第一位, 即符号位修改为一开始的 符号位 = x s ⊕ y s =x_s\oplus y_s =xsys
    然后 累加器 A C C ACC ACC 和 乘商寄存器 M Q MQ MQ 组合起来的数字就是最终乘积的结果
    在这里插入图片描述
  8. 将上述过程简化成手算过程就是这样:
    在这里插入图片描述

2. 补码乘法运算

  • 补码乘法 和 原码乘法 类似, 但也有不同:
    在这里插入图片描述
  • 在 补码乘法 的运算中:
    • 所有寄存器的机器字长统一 n + 2 n+2 n+2 位, 采用双符号位表示补码.
    • 乘商寄存器 M Q MQ MQ 中, 用 单符号位表示 乘数 补码, 最后一位 机器位 放辅助位, 初始为0
    • 辅助位 - M Q MQ MQ中最低位 = 1, ( A C C ) + [ x ] 补 (ACC)+[x]_补 (ACC)+[x]
      辅助位 - M Q MQ MQ中最低位 = 0, ( A C C ) + 0 (ACC)+0 (ACC)+0
      辅助位 - M Q MQ MQ中最低位 = -1, ( A C C ) + [ − x ] 补 (ACC)+[-x]_补 (ACC)+[x]
    • 加法结束后, A C C ACC ACC M Q MQ MQ 一起 算数右移
    • 一直右移到 原来放在乘商寄存器 M Q MQ MQ的乘数的符号位 后, 还得继续进行一次加法
    • 最后 累加器 A C C ACC ACC 和 乘商寄存器 M Q MQ MQ 共同构成最后的乘积(带符号位)
      在这里插入图片描述

d. 定点小数的除法运算

1. 原码除法运算

1-1. 恢复余数法

  • 通用寄存器 X X X 存放 除数
    累加器 A C C ACC ACC 存放 被除数
    乘商寄存器 M Q MQ MQ 存放 结果商
  • 符号位单独处理 x s ⊕ y s x_s \oplus y_s xsys
  • 将对应 除数, 被除数 放入 通用寄存器 X X X, 累加器 A C C ACC ACC 中, 乘商寄存器 M Q MQ MQ置0
    在这里插入图片描述
  1. 每轮直接无脑上商 1 1 1
    在这里插入图片描述
  2. 求余数: ( A C C ) − ( 除 数 ) → A C C (ACC)-(除数)\rightarrow ACC (ACC)()ACC
    在这里插入图片描述
  3. 发现 A C C ACC ACC 中, 余数为负数, 商改为 0 0 0
    在这里插入图片描述
  4. 商改为 0 0 0 后, A C C ACC ACC 也应该改回来, 所以 ( A C C ) + ( 除 数 ) → A C C (ACC)+(除数)\rightarrow ACC (ACC)+()ACC, 这一步就叫 恢复余数
    在这里插入图片描述
  5. 然后 A C C ACC ACC M Q MQ MQ 总体 逻辑左移
    在这里插入图片描述
  6. 重复 1~5 步, 直至 乘商寄存器 M Q MQ MQ 中所有机器位的都有确定的商
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  7. 最后得到结果
    在这里插入图片描述
  8. 总结: 看流程图
    在这里插入图片描述

1-2. 加减交替法(不恢复余数法)

  • 核心思想:
    在这里插入图片描述
  • 总体流程:
    在这里插入图片描述
    在这里插入图片描述

2. 补码除法运算

  • 精髓:
    在这里插入图片描述
  • 有一道经典的题:
    在这里插入图片描述
    • 这道题如果不深究, 可以直接选 B B B, 应为补码的乘除法, 重点的一步就是 符号位 参与运算
    • 如果深究的话:
      • 什么叫够减: 被减数的 绝对值 大于 减数 绝对值
      • 同号相除:
        求余数 够减 不够减
        减法 除数和余数同号 1 除数和余数异号 0
      • 异号相处:
        求余数 够减 不够减
        加法 除数和余数异号 0 除数和余数同号 1
      • 如: 被除数 -3, 除数 -2 和 +2, 够减
        • − 3 与 − 2 同 号 ⇒ − 3 − ( − 2 ) = − 1 ⇒ 余 数 和 除 数 同 号 ⇒ 商 1 -3 与 -2 同号 \Rightarrow -3 - (-2) = -1 \Rightarrow 余数和除数同号 \Rightarrow 商1 323(2)=11
        • − 3 与 + 2 异 号 ⇒ − 3 + ( + 2 ) = − 1 ⇒ 余 数 和 除 数 异 号 ⇒ 商 0 -3 与 +2 异号 \Rightarrow -3+(+2)=-1 \Rightarrow 余数和除数异号 \Rightarrow 商0 3+23+(+2)=10

e. C语言中的证书类型及类型转换

f. 数据的存储和排列


III. 浮点数的表示与运算

a. 浮点数的表示

b. 浮点数的加减运算

猜你喜欢

转载自blog.csdn.net/JackyAce6880/article/details/126120398