gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 01:08:45 25 4
gpt4 key购买 nike

假设a=1

1+(-1) =0

但对于 4 位二进制,使用 2 的补码

0001+1111=10000 ~ 0000

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

我们是否依赖未定义的行为来获得如此微不足道的结果,还是我遗漏了什么。

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

最佳答案

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

仅当容器不够大而无法正确表示数字时才会设置溢出位。对于有符号数,硬件在分析每个操作数的符号位和结果的符号后设置该位。如果操作数的符号不同,则永远不会设置该位。否则,如果操作数的信号相等,则分析结果的符号。如果与操作数不同,则置位该标志,表示结果溢出。

在你的例子中,每个操作数的符号不同,所以没有溢出,但是如果你想使用大容器来保持操作正确,这个操作会产生一个进位。

关于c++ - 操作 a+(-a) 期间溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17685140/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com