这是我们为课堂提供的图表:
你为什么不在这张图片中使用 C4 呢?如果 C4 为 1,那么最后的加法导致溢出,这就是我们想知道的。为什么我们需要看C3?
这是我们为课堂提供的图表:
你为什么不在这张图片中使用 C4 呢?如果 C4 为 1,那么最后的加法导致溢出,这就是我们想知道的。为什么我们需要看C3?
溢出标志指示有符号操作的溢出条件。
在签名操作中要记住的几点:
- 如果两个正数之和产生负结果,则和溢出。
- 如果两个负数之和产生正结果,则和溢出。
- 否则,总和没有溢出。
例如:
**Ex1:**
0111 (carry)
0101 ( 5)
+ 0011 ( 3)
==================
1000 ( 8) ;invalid (V=1) (C3=1) (C4=0)
**Ex2:**
1011 (carry)
1001 (-7)
+ 1011 (−5)
==================
0100 ( 4) ;invalid (V=1) (C3=0) (C4=1)
**Ex3:**
1110 (carry)
0111 ( 7)
+ 1110 (−2)
==================
0101 ( 5) ;valid (V=0) (C3=1) (C4=1)
在有符号运算中,如果最左边的两个进位位(在这些示例中位于顶行最左侧的位)均为 1 或均为 0,则结果有效;如果左两个进位位是“1 0”或“0 1”,则发生符号溢出。方便的是,对这两位进行异或运算可以快速确定是否存在溢出条件。(参考:二进制补码)
溢出与进位:溢出可以被认为是进位的二进制补码形式。在有符号操作中,溢出标志被监视并且进位标志被忽略。类似地,在无符号操作中,进位标志被监控,溢出标志被忽略。
当最高有效位的进位不等于进位时,会发生有符号数的溢出。
例如,使用 8 位,65 + 64 = 129 实际上会导致溢出。这是因为这是二进制的 1000 0001,也是 2 的补码的 -127。如果你通过这个例子,你可以看到这是进位不等于进位的结果。
即使进位标志为高,也可以进行正确的计算。
考虑
1000 1000 = -120
+ 1111 1111 = -1
=(1) 10000111 = -121
有 1 的进位,但没有溢出。
对于任何正的自然位数,我想给这个问题一个更一般的答案。
让我们将最后一个进位输出 C1、倒数第二个进位输出 C0、和符号输出 S0 以及 A 和 B 的符号位分别称为 A0 和 B0。
那么以下成立:
C1 = A0 + B0 + C0
S0 = A0*B0 + A0*C0 + B0*C0
现在让我们来看看这些可能性。
C1 == 1
有两种可能:
C0 == 0
: A0 和 B0 必须都为 1(因此 A 和 B 都必须为负)。这意味着 S0 必须为 0 表示解决方案为正而 A 和 B 为负 => 溢出C0 == 1
:要么
C1 == 0
有两种可能:
C0 == 0
:要么
C0 == 1
: A0 en B0 必须都是 0(因此 A en B 必须都是正数)这意味着 S0 必须为 1 意味着解是负数,而 A en B 是正数 => 溢出希望能帮助那里的人。