6

重複の可能性:
C /C++で整数のオーバーフローを検出するための最良の方法

多くの場合、C ++で大きな数値を使用してコーディングした場合、long longやその他の64ビットデータ型などを使用している場合でも、オーバーフローがいつ発生しているかがわかりません。誤った値を目撃するよりも、オーバーフローが発生していることを検出する効果的な方法はありますか?

4

2 に答える 2

2

標準のC++から得られるものはそれほど多くないかもしれません。

5式

4式の評価中に、結果が数学的に定義されていないか、そのタイプの表現可能な値の範囲内にない場合、動作は未定義です。[注:C ++の既存の実装のほとんどは、整数のオーバーフローを無視します。ゼロによる除算、ゼロ除数を使用した剰余の処理、およびすべての浮動小数点の例外はマシンによって異なり、通常はライブラリ関数によって調整可能です。—エンドノート]

最善の策は、おそらくで定義されている標準の固定幅整数型を使用すること<cstdint>ですuint32_t

のようなエラーコードについては、<cerrno>ヘッダーも確認してくださいEOVERFLOW。次に、からのoverflow_error/underflow_errorクラスがあり<stdexcept>ます。

于 2012-06-02T20:14:50.947 に答える
1

実際には、符号付き整数演算のオーバーフローは未定義の動作をもたらすため、事後にオーバーフローを確実に検出することさえできません。コンパイラがオーバーフローが発生した場合にのみコードパスに到達したことを確認できる場合は、完全に最適化することができます(未定義動作の場合は、何でも実行できるため)。符号なしタイプは、オーバーフロー特性が定義されているという点で異なります(モジュラス演算を実行します)。

したがって、符号付きタイプのオーバーフローを検出する唯一の方法は、事前に適切なチェックを行うことです。これは非常にコストがかかります。ほとんどの場合、アルゴリズムの不変条件によってオーバーフローが発生しないように設計する方がはるかに効率的です。

オーバーフローが発生する前に検出するためのリソースについては、https://stackoverflow.com/a/199413/445525を参照してください。

于 2012-06-02T20:27:05.997 に答える