2013-01-16 5 views
6

2つの整数を乗算するなどの数学演算を実行した後、C++でCPUのオーバーフローフラグレジスタにアクセスすることは可能ですか?オーバーフローをチェックする他の高速方法は何ですか?C++でCPUのオーバーフローフラグレジスタにアクセスすることはできますか?

+2

を確認してください。これを確認してください。http://stackoverflow.com/questions/199333/best-way-to-detect-integer-overflow-in-cc – acrilige

+0

@acrilige thanks、その私の質問の2番目の部分、計算を実行した後のオーバーフローをチェックする方法についての任意のアイデアに答えますか? –

+0

オーバーフローフラグレジスタに直接アクセスすることは、標準的な移植可能な方法では不可能です。しかし、作業が少しだけオーバーフローするかどうかを判断することができ、これをチェックしたり、オーバーフローを非標準の非移植可能な方法で検出する方法があります。 –

答えて

6

いいえ、一般的に不可能です。いくつかのCPUは、そのようなフラグ(例えば、MIPS)も有していない。

コメントの1つに記載されているlinkは、オーバーフローチェックの仕方に関するアイディアを提供します。

CおよびC++符号付き整数オーバーフローでは、未定義の動作が発生し、事実の後では合法的にオーバーフローチェックを実行できないことに注意してください。符号なし算術を使用するか、算術演算の前にチェックを行う必要があります。

4

私はすべての適切なケースでこの読書をお勧めします。 Optimizing software in C++ -

整数オーバーフローがセキュリティ上の別の問題です。公式のC標準 は、オーバーフローの場合の符号付き整数の振る舞いは "未定義"であると言います。これにより、コンパイラはオーバフローを無視したり、 が発生しないと想定します。 Gnuコンパイラの場合、符号付き整数オーバーフローが発生しないと仮定した は残念ながら という結果になり、コンパイラはオーバーフローを最適化して のチェックを行うことができます。 (1)オーバーフローが発生する前にチェックする、(2)符号なし整数を使用する - ラップアラウンドが保証されている、(3) オプション-ftrapvでトラップ整数オーバフローが発生する可能性があります。 (4)オプション -Wstrict-overflow=2でコンパイラ を警告するか、(5)オプション -fwrapvまたは-fno-strict-overflowでオーバーフロー動作を明確に定義します。

0

これは二つの理由のために何をしたいのか、おそらくではありません。

  1. ないすべてのCPUが
オーバーフローフラグにアクセスする方法は実際には存在しないC++を使用して、オーバーフローフラグ
  • を持っています

    人が前に投稿したオーバーフローチェックのヒントが役立つかもしれません。

    2つの整数を乗算してオーバーフローフラグをチェックする高速なコードを本当に書きたい場合は、アセンブリを使用する必要があります。 x86の例が必要な場合は、

  • 関連する問題