2015-09-27 348 views
3

我看到,当我用two's complement减去正数和负数时,我得到溢出。例如,如果我减去1 2我得到:如何在二进制补码中检测到溢出?

2 = 0010 
1 = 0001 -> -1 = 1111 
2 + (-1) -> 0010 + 1111 = 10001 

所以这里的结果是左五位10001 - 是溢出了吗? 我发现这些规则来检测溢出二进制补码:

如果两个正数的总和产生了负结果,总和 溢出。如果两个负数的总和得到正数 结果,则总和已经溢出。否则,总和没有溢出。

任何人都可以请详细说明这些和显示示例?

+0

您的最后一个示例不一致。 '-1'的值以四位给出,但您的答案是以五位计算的。如果你的字大小是5位,那么'-1'的值应该是'11111',而不是'1111'。在一个5位字中,'1111'是值'15',而不是'-1'。你计算了'2 + 15 = -15'。另外,你的编程问题是什么? (这不是一个真正的编程问题。) –

+0

对不起,我不明白。我将'-1'转换为四位,然后添加并接收五位。我应该怎样做不同? –

+0

您添加了两个带符号的4位值并生成了一个5位结果,这会使4位值的原始计算无效。这就像向一个人展示一个1升的桶并告诉他们:“把它填满,但只有5ml。”他们把995毫升。你有另一个桶里有10毫升的水。你把它们倒入一个10升的桶中,然后说:“嘿,这个10升的桶没有溢出,那个人把1升桶里的水放进去了,因为我预计它会溢出5毫升!” –

回答

4

让我们从题目问题的答案开始。

如何在二进制补码中检测到溢出?

溢出规则:如果添加具有相同符号的两个数字(正或负二者),则溢出发生当且仅当所述结果具有相反的符号。

但你问你的问题后,你的问题的身体不同的东西。

所以这里的结果有剩下的第五位10001 - 溢出了吗?

不!这里没有溢出。第五位是进位/借位。随身携带,如果你正在谈论增加。借用,如果你在谈论减法。

当您试图表示的数字超出可以表示的数字范围时,会发生溢出。在你的例子中,你使用的是4位二进制补码,这意味着你可以表示-81000)到+70111)范围内的任何数字。你的减法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

+0

中显示了它,谢谢,我将读一些关于'carry flag'和'overflow flag'的信息,并回答问题。 –

1

@ GabrielOshiro的答案是非常好的。我只想在这里添加一点逻辑。当您添加2和-1一起在这里

2 = 0010 
1 = 0001 -> -1 = 1111 
2 + (-1) -> 0010 + 1111 = 10001 

你应该从其余位负数的最显著位分开,因为在二补该位带来的负值。所以,如果你第一次添加一切第一:

0010 + 0111(leave out the leftmost 1 for now) = 1001 

在此之后,我们可以清楚地看到,在“10001”的第五位是通过将“1”在我们离开前面(第四位)1001引起的,在第五位产生进位。但是,由于这个“1”实际上应该与1001抵消,所以给我们留下0001,我们可以放心地忽略这里的“10001”中的额外位。

更深入的推理会考虑我们什么时候可以放心地忽略这个额外的位,什么时候我们不能。正如@GabrielOshiro所说的那样,当最重要的结果和结果不一样时,我们不能忽视它。在进行中,由于没有空间来容纳额外的位,所以丢失了2个单位的负数,并且在携带中两个正数的单位丢失,因为假定为正数的单位被认为是一个负数的单位。这里1 - (-1)= 2。因此,一个进位和一个进位将相互抵消。但是,当只有其中一个发生时,结果将不正确,因此我们有溢出。