2

上下文

我在一本教科书上读到...

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

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

但是,通过经历一些问题,情况似乎并非如此,我想确认我计算的不是一些错误。

例如,在其中适用的上下文中,对于 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. 鉴于范围是 -8 到 7,有符号整数和无符号整数是否也会导致溢出,例如 (-1+9)

例如

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

C: 1 and V: 1

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

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

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

TL;博士

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

4

2 回答 2

3

“溢出位”通常被定义为添加或减去两个有符号数,当处理有符号数时,第一位是符号,因此对于 4 位加法器,7 是可用的最大整数,当您选择 10 时,您已经选择了更大的数字比你的加法器支持,1010 并不意味着 10 而是 -6,事实上,你是从 5 中减去 -6,这会导致溢出。

于 2015-11-04T19:56:08.217 回答
2

我认为 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。

11011
00100 (inverted)
00001 (adding 1)
00101 (-5)

所以答案是-5,你做到了没有溢出。

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

于 2018-09-26T01:57:18.333 回答