私は、悲惨な整数のオーバーフローが本当にいかにあるか疑問に思っていました。次のプログラム例テイク:32ビット・プラットフォーム上のa * a
オーバーフローのでC++の整数オーバーフローはどれほど悲惨ですか?
#include <iostream>
int main()
{
int a = 46341;
int b = a * a;
std::cout << "hello world\n";
}
を、整数オーバーフローは未定義の動作をトリガし、私はすべてのことhello world
で任意の保証を持っています実際に私の画面上に表示されますか?
私は、次の標準的な引用符に基づいて、私の質問から一部を "署名" 削除:場合
(§5/ 5 C++ 03、§5/ 4 C++ 11)式の評価中に結果が数学的に定義されていないか、その型の表現可能な値の範囲にない場合、その動作は定義されていません。
(§3.9.1/ 4)
unsigned
と宣言された符号なし整数は、2^nを法とする算術の法則に従うものとします.nは整数の特定の値の値表現のビット数です。これは、の符号なし算術は、結果の符号なし整数型で表現できない結果が、結果の符号なし整数型で表現できる最大値よりも1だけ小さい値になるため、オーバーフローすることを意味しません()。
C++でオーバーフローが発生したことはありません。数字は楽しくラップアラウンドし、プロセッサのオーバーフローフラグを設定します。 – Brain2000
@ Brain2000ほとんどの場合、最適化の問題が発生します。 '(a + 1> a)'はオーバーフローにもかかわらず常に真です。 – Pubby
[GCC Fail?または定義されていない動作?](http://stackoverflow.com/questions/7682477/gcc-fail-or-undefined-behavior) – Xeo