让我们从题目问题的答案开始。
如何在二进制补码中检测到溢出?
溢出规则:如果添加具有相同符号的两个数字(正或负二者),则溢出发生当且仅当所述结果具有相反的符号。
但你问你的问题后,你的问题的身体不同的东西。
所以这里的结果有剩下的第五位10001
- 溢出了吗?
不!这里没有溢出。第五位是进位/借位。随身携带,如果你正在谈论增加。借用,如果你在谈论减法。
当您试图表示的数字超出可以表示的数字范围时,会发生溢出。在你的例子中,你使用的是4位二进制补码,这意味着你可以表示-8
(1000
)到+7
(0111
)范围内的任何数字。你的减法2-1
的结果是+1
,这是一个位于表示范围内的数字。
当我们添加一个负值和一个正值操作数时,结果将始终在表示范围内。当我们添加具有相同符号的两个数字(正数或负数)并且结果符号相反时,会发生溢出。
大部分围绕进位和溢出的误解来自于我们使用进位作为参数来产生溢出标志的事实。他们强烈关联,但他们不是一回事。
当在二进制补码中添加数字时,如果进位和进位到最高有效位(符号位)不同,则意味着发生了溢出。
让我们来看看两个负操作数有一个积极的结果:
-8 + (-1) = -9
1000 (carry)
1000 (-8)
+ 1111 (-1)
------
0111 (+7) OVERFLOW!
搬出为1,随身携带的签位(MSB)为0
而现在,一个例子两个积极的操作数的负面结果。
+7 + 1 = +8
0111 (carry)
0111 (+7)
+ 0001 (+1)
------
1000 (-8) OVERFLOW!
搬出是0和随身携带的签位(MSB)为1
您的最后一个示例不一致。 '-1'的值以四位给出,但您的答案是以五位计算的。如果你的字大小是5位,那么'-1'的值应该是'11111',而不是'1111'。在一个5位字中,'1111'是值'15',而不是'-1'。你计算了'2 + 15 = -15'。另外,你的编程问题是什么? (这不是一个真正的编程问题。) –
对不起,我不明白。我将'-1'转换为四位,然后添加并接收五位。我应该怎样做不同? –
您添加了两个带符号的4位值并生成了一个5位结果,这会使4位值的原始计算无效。这就像向一个人展示一个1升的桶并告诉他们:“把它填满,但只有5ml。”他们把995毫升。你有另一个桶里有10毫升的水。你把它们倒入一个10升的桶中,然后说:“嘿,这个10升的桶没有溢出,那个人把1升桶里的水放进去了,因为我预计它会溢出5毫升!” –