3

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

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

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

我确定递增后结果将始终为<0吗?

谢谢

4

2 回答 2

4

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

如果在计算表达式期间,结果未在数学上定义或不在其类型的可表示值范围内,则行为未定义,除非此类表达式是常量表达式,在这种情况下程序格式错误。[注意:大多数现有的 C++ 实现忽略整数溢出]。

此外,没有任何东西5.7 Additive operators可以修改这种行为。这在 C++11 中没有改变。

那是针对签名类型的,这是您在问题中所问的。


如果您也对无符号类型感兴趣,请参阅部分3.9.1 Fundamental types, paragraph 4说明:

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

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

于 2012-09-05T06:00:04.060 回答
3

不,有符号整数类型的溢出会导致未定义的行为。

编辑:除了 paxdiablo 的报价:

3.9.1。

注 46)这意味着无符号算术不会溢出,因为不能由得到的无符号整数类型表示的结果以比得到的无符号整数类型可以表示的最大值大 1 的数字为模减少。

于 2012-09-05T05:57:15.703 回答