当i++导致整数溢出时会发生什么

What happens when i++ causes an integer overflow?

本文关键字:什么 溢出 i++ 整数      更新时间:2023-10-16

可能重复:
C++下溢和上溢

我在c++中有以下代码:

int temp = std::numeric_limits<int>::max();
temp++;

我确信递增后的结果总是<0?

感谢

不,不能保证。C++03在5 Expressions, paragraph 5:中有这样的说法

如果在评估表达式的过程中,结果没有在数学上定义,或者不在其类型的可表示值范围内,则行为是未定义的,除非这样的表达式是常量表达式,在这种情况下,程序格式不正确。[注意:大多数现有的C++实现都忽略整数溢出]。

此外,5.7 Additive operators中没有任何内容可以改变这种行为。这在C++11中是不变的。

这是针对签名类型的,这是您在问题中询问的内容。


如果您也对无符号类型感兴趣,3.9.1 Fundamental types, paragraph 4部分指出:

声明为无符号的无符号整数应遵守算术模2n的定律,其中n是该特定大小整数的值表示中的位数(见脚注41)。

脚注41:这意味着无符号算术不会溢出,因为无法由结果的无符号整数类型表示的结果会以比所产生的无符号整型所能表示的最大值大一的数字为模进行减少。

否,有符号积分类型中的溢出会导致未定义的行为。

编辑:除了paxdiablo的报价:

3.9.1.

注46)这意味着无符号算术不会溢出,因为无法由生成的无符号整数表示的结果类型被模化为比最大值大一的数字可以由生成的无符号整数类型表示的值。