重複の可能性:
C /C++で整数のオーバーフローを検出するための最良の方法
多くの場合、C ++で大きな数値を使用してコーディングした場合、long longやその他の64ビットデータ型などを使用している場合でも、オーバーフローがいつ発生しているかがわかりません。誤った値を目撃するよりも、オーバーフローが発生していることを検出する効果的な方法はありますか?
重複の可能性:
C /C++で整数のオーバーフローを検出するための最良の方法
多くの場合、C ++で大きな数値を使用してコーディングした場合、long longやその他の64ビットデータ型などを使用している場合でも、オーバーフローがいつ発生しているかがわかりません。誤った値を目撃するよりも、オーバーフローが発生していることを検出する効果的な方法はありますか?
標準のC++から得られるものはそれほど多くないかもしれません。
5式
4式の評価中に、結果が数学的に定義されていないか、そのタイプの表現可能な値の範囲内にない場合、動作は未定義です。[注:C ++の既存の実装のほとんどは、整数のオーバーフローを無視します。ゼロによる除算、ゼロ除数を使用した剰余の処理、およびすべての浮動小数点の例外はマシンによって異なり、通常はライブラリ関数によって調整可能です。—エンドノート]
最善の策は、おそらくで定義されている標準の固定幅整数型を使用すること<cstdint>
ですuint32_t
。
のようなエラーコードについては、<cerrno>
ヘッダーも確認してくださいEOVERFLOW
。次に、からのoverflow_error
/underflow_error
クラスがあり<stdexcept>
ます。
実際には、符号付き整数演算のオーバーフローは未定義の動作をもたらすため、事後にオーバーフローを確実に検出することさえできません。コンパイラがオーバーフローが発生した場合にのみコードパスに到達したことを確認できる場合は、完全に最適化することができます(未定義動作の場合は、何でも実行できるため)。符号なしタイプは、オーバーフロー特性が定義されているという点で異なります(モジュラス演算を実行します)。
したがって、符号付きタイプのオーバーフローを検出する唯一の方法は、事前に適切なチェックを行うことです。これは非常にコストがかかります。ほとんどの場合、アルゴリズムの不変条件によってオーバーフローが発生しないように設計する方がはるかに効率的です。
オーバーフローが発生する前に検出するためのリソースについては、https://stackoverflow.com/a/199413/445525を参照してください。