Chapter 9 Arithmetic(2)

这一章是很难的,不过我打的就是精锐。😎

Contents of This Lecture

Topic (主题) Description (描述)
Addition of 1-bit Positive Numbers (1位正数相加) Adding two 1-bit positive numbers.
Addition of n-bit Signed Numbers (n位带符号数相加) Adding two n-bit signed numbers (both positive and negative). The process involves considering the sign bit and performing carry operations for the sum.
Subtraction of n-bit Signed Numbers (n位带符号数相减) Subtracting two n-bit signed numbers, which can be done using two's complement or other methods depending on the representation (signed-magnitude, one's complement, etc.).

image-20241122113637487

n位带符号数相加

n位带符号数相加的规则(在二进制补码表示下)

  • 为了将两个数相加,直接将它们的n位二进制表示相加,并且将符号位(最高位)视为普通的比特位,忽略来自符号位的进位。
  • 只要结果位于范围 \(-2^{n-1}\)\(+2^{n-1} - 1\) 之间,二进制补码表示的和是代数正确的。

4位带符号数相加的例子

  • 参考教材第14页图1.6 (a)-(d)进行操作。
image-20241122114103717

4位带符号数相加的例子

image-20241122114119532

算术溢出 (Arithmetic Overflow)

  • 溢出定义: 算术运算的结果超出了可表示的范围。对于有符号数来说,溢出通常发生在结果超出了其表示范围,导致无法准确表示。
  • 充要条件: 如果两个数相加,它们有相同的符号,则当且仅当结果的符号与两个加数都相反时,才会发生溢出。
    • 具体来说:
      • 如果两个加数都是正数,且结果是负数,则发生溢出。
      • 如果两个加数都是负数,且结果是正数,则也发生溢出。

• 注意:

  • 符号位的进位信号不能作为溢出的充分指标: 在加法操作中,符号位的进位信号(Carry-out)并不是判断溢出的充分条件。溢出可以发生,且无论是否有进位信号,都可能发生溢出。
    • 换句话说,溢出不仅仅是通过检查符号位的进位信号来判断的,因为即使没有进位信号,溢出仍然可能发生。

n 位有符号数的减法

• n 位有符号数的减法规则(在有符号 2 的补码表示下)

  • 减法规则:
    要计算两个数 $ X $ 和 $ Y $ 的差,即 $ X - Y $,首先求 $ Y $ 的 2 的补码,然后将其加到 $ X $ 上,按照加法规则执行。

  • 结果的正确性:
    如果结果在 $ -2^{n-1} $ 到 $ +2^{n-1} - 1 $ 的范围内,结果将是 2 的补码表示系统中的代数正确值。

  • 减法的本质:
    $ X - Y = X + (-Y) $,即可以通过将 $ Y $ 取 2 的补码后与 $ X $ 相加来进行减法。

• 2 的补码操作(取负操作)

  • 步骤:
    1. 对整数的每一位(包括符号位)取布尔反码,即将每个 1 变为 0,每个 0 变为 1。
    2. 将反码结果视为无符号二进制数,加 1。
  • 示例:
    • 假设 $ Y = 6 $,其 2 的补码表示为 $ 0110 $,求 $ -Y $ 的 2 的补码表示。
    • 解:
      • $ Y = 0110 $,取反得到 $ 1001 $,然后加 1,得到 $ 1010 $,即 $ -Y = 1010 $。

• 4 位有符号数的减法示例

image-20241122124907916

• 4 位有符号数减法(续)

  • 结论:
    • 图 1.6(第 14 页)中的示例表明,两个 n 位的有符号数可以通过 n 位二进制加法来相加,并且符号位和其他位一样处理。
    • 换句话说,设计用于加法无符号二进制数的逻辑电路,也可以用来加法处理 2 的补码表示的有符号数。

• 溢出示例

  • 问题:
    $ X = 6, Y = -7 $,求 $ X - Y $ 的结果。

    • 解:
      • $ X = 6 = 0110 $
      • $ Y = -7 = 1001 $
      • $ -Y = 0111 $(取反并加 1)

    运算如下:

    1
    2
    3
    4
    0 1 1 0    (X = 6)
    + 0 1 1 1 (-Y = 7)
    -----------
    1 1 0 1 = -3 (溢出)

    结果为 -3,发生了溢出(overflow)。

习题

• 假设 $ X $ 和 $ Y $ 是两个 8 位有符号 2 的补码数,分别为 01011110 和 11001010。计算 $ X + Y $ 的结果是什么?

  • 选项:
    • A. 00101000
    • B. 10010100
    • C. 01000100
    • D. 00011100

• 假设 $ X $ 和 $ Y $ 是两个 8 位有符号 2 的补码数,分别为 01011110 和 11001010。计算 $ X - Y $ 的结果是什么?

  • 选项:
    • A. 00101000
    • B. 10010100
    • C. 01000100
    • D. 溢出 (overflow)

• 判断对错:在 2 的补码二进制算术中,从一个负整数中减去另一个负整数可能会导致溢出。


解答与分析

第一题:$ X + Y $ 的结果

  1. $ X = 01011110 $,转换为十进制是 $ 94 $。
  2. $ Y = 11001010 $,转换为十进制是 $ -54 $(因为符号位是 1,表示负数)。

计算 $ X + Y = 94 + (-54) = 40 $,然后将结果转回 8 位二进制,得 $ 00101000 $。

所以,正确答案是 A. 00101000

第二题:$ X - Y $ 的结果

  1. 我们已经知道 $ X = 94 $ 和 $ Y = -54 $。
  2. $ X - Y = 94 - (-54) = 94 + 54 = 148 $。

将 148 转换为 8 位二进制表示,得到 $ 10010100 $。

第三题:从一个负整数中减去另一个负整数可能会导致溢出?

因此,这个说法是错误的,从一个负整数中减去另一个负整数不可能发生溢出。