溢出和携带标志

时间:2015-11-04 19:37:24

标签: bit-manipulation integer-overflow circuit integer-arithmetic digital-logic

上下文

我在教科书中读到......

加法和减法不会导致溢出。引用,

  

“如果一个数字为正数而另一个数字为负数,则在添加后不会发生溢出,因为将正数加到负数会产生幅度较小的结果(...)”。

然而,通过遇到一些问题似乎并非如此,我想确认我计算的不是一些错误。

例如,适用的上下文,对于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.

通过执行此问题已经出现了几个问题。

  1. 尽管没有溢出(数量在范围内)
  2. ,但溢出位置位
  3. 假设范围是-8到7,那么有符号整数和无符号整数也不会导致溢出,例如(-1 + 9)
  4. e.g

    -1      1110
    +9      1001
    -------------
    result: 1111
    result 2s:    0001 (1)
    
    C: 1 and V: 1
    

    我注意到当C = 0时没有溢出,当C = 1时有溢出。

    我读到两个无符号整数之间的溢出关系是V溢出标志。 另一方面,两个有符号整数之间的溢出关系与C进位标志有关。这可能是相关的吗?

    最后,注意无符号和有符号整数之间存在溢出,尽管我引用的语句与之相矛盾。

    TL; DR

    是否可以添加无符号整数和有符号整数之间的溢出?如果是这样,无符号整数和有符号整数的关系对于溢出(C或V标志)是什么?

2 个答案:

答案 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,您做到了而不会溢出。

这里的好处是使您需要添加一个正数溢出。要使负数溢出,您必须从中减去。如果两个数字都具有不同的符号(并且它们是有效的),它们必须可以放入同一空间而不会溢出。

相关问题