我对C ++很新,当我试图用蛮力做某事时,在添加一些正整数的同时,我注意到在某些时候总和变为负数。
通过仔细观察,我注意到添加2147483647和1正在返回-2147483648。
有人知道为什么会出现这个标志吗?
答案 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
,那么它可以很好地定义以执行您正在设置的内容。