2017-07-26 189 views
1

我已经阅读了溢出意味着两个定义。溢出意味着什么?

说,我们有如下补充:

11111111 
00000001 
-------- 
100000000 

我看过的第一个定义是这样一个事实,结果没有融入8位(它需要9位在这个例子中),那么这被称为溢出。


我看过其他的定义是,如果我们有另外两个有符号整数(例如两个互补整数):

10011001 
10111011 
-------- 
101010100 

这时如果8位的结果(01010100)有符号与两个整数的符号不同(在本例中它不同),那么这称为溢出。

哪个定义正确?

+0

第一个定义是基础。第二个是后效 – MBo

+0

它们实际上是一样的东西 –

+0

一个是签名的,另一个是未签名的溢出,你应该这样想。在这两种溢出情况下,仅仅意味着你没有足够的位来正确表示结果。基本上你还需要一点。 –

回答

5

它们都是正确的。当数字的计算由于结果不再适合存储的数字格式而导致错误时,会发生溢出。

因此,在第一种情况下,发生溢出是因为您需要9位,并且只有8位可用(意味着现在存储在该字节中的数字不能准确反映答案)。

在第二种情况下,发生溢出是因为结果干扰了带符号的位,从而导致包含错误值的字节。

+0

很好的回答,欢迎来到SO! –

+0

由于CF OF&AF标志中的转换仅仅表示之前操作的结果,因此会导致某些读者误导“导致错误”。 X86中的错误,假设我们正在讨论的架构会引发异常。 –

+0

我的意思是数学错误而不是运行时错误。在Z80中,两种情况都触发了CPU中的标志,可以测试它是否发生溢出。 –

6

这两种情况都可以通过增加一位来解决。 如Wikipedia page for Integer Overflow所示,当操作结果不符合目标寄存器/变量时,会发生整数溢出。例如。 0x10000 * 0x10000对于32位整数也是一个溢出。

典型处理器体系结构将无符号整数溢出与有符号整数溢出的情况分离为状态寄存器中的两个不同标志;携带/借用未签名和溢出签名添加。