我看到当我使用two's complement
减去正数和负数时,我会溢出。例如,如果我从2中减去1,我得到:
2 = 0010
1 = 0001 -> -1 = 1111
2 + (-1) -> 0010 + 1111 = 10001
所以这里结果有第五个左位10001
- 它是否溢出?
我已经发现这些规则用于检测到溢出有两个补码:
如果两个正数的总和产生负结果,则总和 已经溢出。如果两个负数的总和产生正数 结果,总和已经溢出。否则,总和没有溢出。
任何人都可以详细说明这些并展示示例吗?
答案 0 :(得分:13)
让我们从你的标题问题的答案开始。
如何在二进制补码中检测到溢出?
溢出规则:如果添加了两个具有相同符号的数字(均为正数或均为负数),则当且仅当结果符号相反时才会发生溢出。
但是在你的例子之后,你会在问题正文中提出不同的问题。
所以这里结果有第五个左位
-8
- 它是否溢出?
没有!这里没有溢出。第五位是进位/借位。如果你在谈论添加,请携带。如果你在谈论减法,请借用。
当您尝试表示的数字超出可以表示的数字范围时,会发生溢出。在您的示例中,您使用的是4位二进制补码,这意味着您可以表示1000
(+7
)范围内的任何数字,直到0111
(2-1
)。减法+1
的结果是-8 + (-1) = -9
1000 (carry)
1000 (-8)
+ 1111 (-1)
------
0111 (+7) OVERFLOW!
,这是一个位于代表范围内的数字。
当我们添加负操作数和正操作数时,结果将始终在表示范围内。当我们添加两个具有相同符号的数字(正数或两者都为负数)且结果符号相反时会发生溢出。
大多数围绕进出和溢出的误解来自于我们使用进位作为生成溢出标志的参数之一的事实。它们密切相关,但它们不是一回事。
当以二进制补码加数时,如果进位和最高有效位(符号位)的进位不同,则表示发生了溢出。
让我们看看两个带有正面结果的负面操作数:
+7 + 1 = +8
0111 (carry)
0111 (+7)
+ 0001 (+1)
------
1000 (-8) OVERFLOW!
进位为1且进位到符号位(MSB)为0。
现在,这是一个带有负面结果的两个正操作数的例子。
{{1}}
进位为0且进位到符号位(MSB)为1.