これはおそらく慣例の問題であり、用語が非常に一貫していないことが多いため、この問題に関する「信頼できる」情報源を実際に見つけることはできません。しかし、Robert Seacordの「CおよびC ++でのセキュアコーディング」からの次の抜粋は、状況についての私の理解を要約したものです。
整数オーバーフローは、整数が最大値を超えて増加したり、最小値を超えて減少したりすると発生します3。整数オーバーフローは、基になる表現と密接に関連しています。
脚注はさらに続けます:
[3] 技術的にこの用語は浮動小数点条件を指しますが、最小値を超えて整数を減少させることは、しばしば整数アンダーフローと呼ばれます。
整数オーバーフローと呼ぶ理由は、値を表すのに十分なスペースが型で利用できないためです。その意味では、バッファオーバーフローと同様だ(むしろ実際のバッファ境界、それ通常展示ラップアラウンド動作を横切るより除く。*)このような観点から、間に概念的な差がないINT_MIN - 1
とはINT_MAX + 1
。どちらの場合も、int
データ型にはどちらの値も表すのに十分なスペースがないため、オーバーフローが発生します。
また、x86およびx86_64プロセッサアーキテクチャでは、フラグレジスタにオーバーフロービットが含まれていることに注意してください。オーバーフロービットは、符号付き整数の算術演算がオーバーフローすると設定されます。式INT_MIN - 1
はオーバーフロービットを設定します。(「アンダーフロー」ビットはありません。)そのため、AMDおよびIntelのエンジニアは、「オーバーフロー」という用語を使用して、ビット数が多すぎてデータ型に収まらない整数算術演算の結果を説明します。数値が大きすぎるか小さすぎます。
*実際、Cでは、符号付き整数オーバーフローは実際には未定義の動作ですが、Javaなどの他の言語では、2の補数演算がラップアラウンドします。
INT_MIN - 1
かINT_MAX + 1