悲惨な整数オーバーフローが実際にどの程度なのか疑問に思っていました。次のプログラム例を見てください。
#include <iostream>
int main()
{
int a = 46341;
int b = a * a;
std::cout << "hello world\n";
}
a * a
32 ビット プラットフォームではオーバーフローが発生し、整数オーバーフローは未定義の動作を引き起こすため、画面に実際に表示されるという保証はありますhello world
か?
次の標準的な引用に基づいて、質問から「署名済み」の部分を削除しました。
(§5/5 C++03、§5/4 C++11) 式の評価中に、結果が数学的に定義されていないか、その型の表現可能な値の範囲内にない場合、動作は未定義です。
(§3.9.1/4) 宣言された符号なし整数は、
unsigned
2^n を法とする算術法則に従うものとします。ここで、n は、整数の特定のサイズの値表現のビット数です。これは、結果の符号なし整数型で表現できない結果が、結果の符号なし整数型で表現できる最大値よりも 1 大きい数値を法として減らされるため、符号なし算術演算がオーバーフローしないことを意味します。