2011-10-28 6 views
3

可能性の重複:
Best way to detect integer overflow in C/C++チェック

加算、乗算または減算のような任意の演算がオーバーフローを引き起こすことができれば、我々はどのようにチェックしますか?

+0

私の質問は特に符号なし整数に向いています – pravs

+0

厳密に言えば、符号なし算術はオーバーフローしません。それはよく定義された方法でラップアラウンドします。しかし、それは単語 "オーバーフロー"の意味についてのちょっとした疑問であり、あなたの質問に答えることはできません。 –

答えて

1

オペランドのサイズを最初に確認し、std::numeric_limitsを使用します。例えば、追加のために:

#include <limits> 

unsigned int a, b; // from somewhere 

unsigned int diff = std::numeric_limits<unsigned int>::max() - a; 

if (diff < b) { /* error, cannot add a + b */ } 

あなたは、一般的にかつ確実に後の実際の算術エラーを検出することができない、あなたはすべての前にチェックをしなければならないので。

このアプローチを簡単にテンプレート化して、任意の数値タイプで使用できるようにすることができます。

+0

こんにちは、いくつかのロジックを使用し、この問題を解決するために任意のテンプレートを使用せずに任意のメソッドがありますか? – pravs

+0

私はあなたが 'a + = b; if(a

+0

@pravs: 'std :: numeric_limits :: max()'を 'UINT_MAX'に置き換えてください。 –