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: これは、結果の符号なし整数型で表現できない結果が、結果の符号なし整数型で表現できる最大値よりも 1 大きい数値を法として減らされるため、符号なし算術演算がオーバーフローしないことを意味します。

于 2012-09-05T06:00:04.060 に答える
3

いいえ、符号付き整数型のオーバーフローにより、未定義の動作が発生します。

編集:paxdiabloの引用に加えて:

3.9.1.

注 46) これは、結果の符号なし整数型で表現できない結果が、結果の符号なし整数型で表現できる最大値よりも 1 大きい数値を法として減らされるため、符号なし算術演算がオーバーフローしないことを意味します。

于 2012-09-05T05:57:15.703 に答える