溢出意味着什么?

时间:2017-07-26 18:00:49

标签: math assembly integer overflow twos-complement

我已经读了两个关于溢出意味着什么的定义。

说我们有以下补充:

 11111111
 00000001
 --------
100000000

我读过的第一个定义是结果不适合8位(在本例中需要9位),这就叫做溢出。

我读过的另一个定义是,如果我们有两个有符号整数的加法(例如两个补码整数):

 10011001
 10111011
 --------
101010100

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

哪个定义是正确的?

2 个答案:

答案 0 :(得分:6)

这两种情况都可以通过在结果中再添加一位来解决。 当Wikipedia page for Integer Overflow状态时,当操作结果不适合目标寄存器/变量时,会发生整数溢出。例如。 0x10000 * 0x10000也是32位整数的溢出。

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

答案 1 :(得分:5)

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

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

在第二种情况下,发生溢出是因为结果会干扰有符号位,导致字节包含不正确的值。