操作期间溢出a +( - a)

时间:2013-07-16 19:15:51

标签: c++ c binary overflow twos-complement

asumming a = 1

1 +( - 1)= 0

但是使用2位二进制,使用2的补码

0001 + 1111 = 10000~0000

是不是有符号整数溢出未定义的行为?

我们是否依赖未定义的行为来获得这些微不足道的结果,或者我遗漏了一些东西。

from wikipedia: 如果左边的两个进位(这些例子中顶行最左边的位)都是1或两者都是0,结果是有效的;如果左侧两个进位位是“1 0”或“0 1”,则发生符号溢出。

4 个答案:

答案 0 :(得分:3)

添加带有相反符号的带符号数字永远不会产生溢出。实际上,硬件通常有两个与加法有关的标志位,即溢出位和进位。

仅当容器不足以正确表示数字时才设置溢出位。对于带符号的数字,硬件在分析每个操作数的符号位和结果的符号后设置该位。如果操作数的符号是​​不同的,它将永远不会设置此位。否则,如果操作数的信号相等,则分析结果的符号。如果它与操作数不同,则设置此标志,表示结果处于溢出状态。

在您的示例中,每个操作数的符号不同,因此没有溢出,但如果您想使用大容器来保持操作正确,则此操作会生成进位。

答案 1 :(得分:2)

有符号整数溢出 未定义,但我在这里看不出这是怎么回事,因为你要添加两个带符号的数字,结果确实在范围内。

对于4位整数类型,溢出将添加7 + 7,其中结果应为14,不适合范围-2 ^ 3..2 ^ 3-1

答案 2 :(得分:0)

底层表示可以在内部使用溢出来获得正确的结果,但这是无关紧要的。如果操作的结果超出类型范围,则行为仅为未定义。

答案 3 :(得分:-1)

这是未定义的行为,但我不确定我理解你的问题。你问为什么它在那个例子中起作用?因为这些值在范围内,结果在范围内。考虑

-8 + -1

4位

1000 + 1111 - > 10111 - > 0111 - > 7.在这里,我们不再有正确的答案