我在教科书中读到......
加法和减法不会导致溢出。引用,
“如果一个数字为正数而另一个数字为负数,则在添加后不会发生溢出,因为将正数加到负数会产生幅度较小的结果(...)”。
然而,通过遇到一些问题似乎并非如此,我想确认我计算的不是一些错误。
例如,适用的上下文,对于4位加法器 - 减法器,其中M = 1(这意味着用B减法), A = 0101(+5),B = 1010(+10)。
通过取B = 0110(-10)的2s补码并加上数字,可以进行减法。
例如 (5)+( - 10)
0 1
+5 0101
-10 0110
-------------
result: 1011
results 2s: 0101 (-5)
C: 0 and V = 1.
通过执行此问题已经出现了几个问题。
e.g
-1 1110
+9 1001
-------------
result: 1111
result 2s: 0001 (1)
C: 1 and V: 1
我注意到当C = 0时没有溢出,当C = 1时有溢出。
我读到两个无符号整数之间的溢出关系是V溢出标志。 另一方面,两个有符号整数之间的溢出关系与C进位标志有关。这可能是相关的吗?
是否可以添加无符号整数和有符号整数之间的溢出?如果是这样,无符号整数和有符号整数的关系对于溢出(C或V标志)是什么?
答案 0 :(得分:2)
“溢出位”通常被定义用于添加或减去两个带符号的数字,当处理带符号的数字时,第一位是符号,因此对于4位加法器7是可用的最大整数,当你选择10时你已经选择一个大于你的加法器支持的数字,1010并不意味着10而是-6,你实际上是从5减去-6,这会导致溢出。
答案 1 :(得分:0)
我认为EduardoS的回答很好,Harold的评论更简洁。您有4位。代表
[ -(2**3) , (2**3 - 1) ]
或更简单地说,
[ -8, 7 ]
您选择-10
。但是,该范围不存在,因此大多数架构都会对其进行包装。这种包装设置溢出。让我们将位域扩展为8位。
00001010 = 10
现在我们将其取反并添加一个
11110110
现在,您可以删除其中的一些1
,因为它本质上是符号扩展的,但是您必须存储符号位,
10110
因此,您必须以5位而不是4位开始。否则,您将丢失符号位,并且溢出。
现在,这是固定的,如果我们添加
00101 (+5)
10110 (-10)
-----
11011
现在将符号位设置为1,因此求反并加1。
11011
00100 (inverted)
00001 (adding 1)
00101 (-5)
答案是-5
,您做到了而不会溢出。
这里的好处是使您需要添加一个正数溢出。要使负数溢出,您必须从中减去。如果两个数字都具有不同的符号(并且它们是有效的),它们必须可以放入同一空间而不会溢出。