在c ++中更改添加符号

时间:2015-03-03 23:22:21

标签: c++

我对C ++很新,当我试图用蛮力做某事时,在添加一些正整数的同时,我注意到在某些时候总和变为负数。

通过仔细观察,我注意到添加2147483647和1正在返回-2147483648。

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

2 个答案:

答案 0 :(得分:5)

这是众所周知的,被称为Integer overflow

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

答案 1 :(得分:2)

有关整数溢出的详细信息。

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

在C和C ++ 11之前的C ++中,实际上是undefined behaviour。最新版本的gcc -O3可能会根据未定义的操作执行优化(例如,在此操作发生时剪切流分支)。

但是,从C ++ 11开始,您可以检查名为bool的{​​{1}}。如果这是std::numeric_limits<int>::is_modulo,那么您的代码是未定义的行为,但如果这是false,那么它可以很好地定义以执行您正在设置的内容。