値型のビット表現をオーバーフロー値の乗算が未定義これにより、正または負の符号ビットで終わる可能性があり、損失ビットの数は可変です。
例1:INT_MAX * 2
:結果は正しいですが、上位ビットが符号ビットを表すため、その型で表されていません。
例2:INT_MAX * 4
:1ビットがオーバーフローするまで失われ、符号ビットは前の例のように正しくありません。
例3:(INT_MAX + 1) * 2 = 0
:すべての設定ビットがオーバーフローしていますが、符号が正しいためです。
私は8ビットのバイナリ表現を使用して読みやすくしています。
0111 1111 // Max positive signed value
+1
1000 0000 // Sign bit set but binary value is correct
*2
0000 0000 // Upper bit is lost due to overflow
この場合、ソフトオーバーフローと情報の損失はありませんが、表現が正しくありません。ビットが結果に存在しなくなったところでハードオーバーフローします。
オーバーフローの違いは、オーバーフローを検出する方法です。通常、ハードオーバーフローはハードウェアによって検出され、ソフトウェアが処理する作業はほとんど必要ありません。しかし、ソフトウェアのオーバーフローは、ハードウェアが通常整数演算の符号ビットを認識しないため、ソフトウェアがオーバーフロー状態を明示的にテストする必要があります。
ランタイムライブラリがオーバーフローを処理する方法は、ライブラリに依存します。ほとんどの人がエラーを投げかけるかもしれないが、そうする方が速いのでほとんどの人が無視するだろう。 未定義の動作であっても、ディスクをフォーマットすることはできません。算術演算の結果は、コードのロジックが指示する場合を除いて、コードの流れを変更しません。オーバーフローを無視するか、何らかの方法で処理しようとします。コードまたはハードウェアが問題を処理しようとする場合、標準ではどのメソッドを採用するかは決まっていません。
基本的に3つの可能性があります。
1.オーバーフローは無視され、戻り値は無効です。
2.オーバーフローは実行時ライブラリによって無視されますが、ハードウェアは無視されるエラーをスローし、実行中のコードにハード障害が発生します。この状況では、次に何が起こるかを判断することはOSに完全に依存しています。ナッツを壊してデータを破壊すると、設計上の決定が悪くなります。
3.オーバーフローは実行時ライブラリによって処理されます。これは、処理を進める上で最良の方法を決定する必要があります。通常、これは、コードにエラーをキャッチして処理する機会を与えること、または可能な限り優雅なコードをシャットダウンすることを意味します。
定義されていない動作を引き起こす値を除いて、存在しません。あなたにはこれをチェックする方法があります。http://stackoverflow.com/questions/199333/how-to-detect-integer-overflow-in-c-c – g24l