c++中加法符号的变化

change of sign of an addition in c++

本文关键字:变化 符号 c++      更新时间:2023-10-16

我对C++很陌生,当我试图用蛮力做一些事情时,在添加一些正整数时,我注意到在某个时刻总和变为负。

通过仔细观察,我注意到将2147483647与1相加会返回-2147483648。

有人知道为什么会出现这个标志吗?

这是众所周知的,称为Integer溢出。

有符号整数的最大值(2147483647)不能超过。
超过它将导致环回到它的最小值-2147483648
它与记忆的工作方式密切相关。

有关整数溢出的更多信息。

从历史上看,这是因为在普通CPU上,发出硬件增量指令会导致您看到的行为。

在C中,以及在C++11之前的C++中,这实际上是未定义的行为。gcc -O3的最新版本可以基于未定义的该操作来执行优化(例如,在发生该操作的地方切除流分支)。

但是,由于C++11,所以有一个名为std::numeric_limits<int>::is_modulobool可以检查。如果这是false,那么您的代码是未定义的行为,但如果是true,那么它被定义为执行您正在设置的内容。