エンジニアのブログです。

C++でオーバーフローの検出

Posted at

競プロでよく出るオーバーフローの検出を、C++でどのように書くかを紹介します。最終的なコードは以下です。

// a + b がオーバーフローするならtrueを返す
template <class T> bool overflow_if_add(T a, T b) {
    return (std::numeric_limits<T>::max() - a) < b;
}

// a * b がオーバーフローするならtrueを返す
template <class T> bool overflow_if_mul(T a, T b) {
    return (std::numeric_limits<T>::max() / a) < b;
}

std::numeric_limits<T>::max()は、型Tの値の最大値を取得します。例えばlong longであればLLONG_MAXを返し、unsigned long longであればULLONG_MAXを返します。

次にa + bがオーバーフローする場合にtrueを返すoverflow_if_add()を見てみましょう。 (std::numeric_limits<T>::max() - a)は、aに足すことのできる残りの値を表し、その値よりbが大きければオーバーフローとなります。

overflow_if_mul()(std::numeric_limits<T>::max() / a)は、aに掛けることのできる残りの値を表し、その値よりbが大きければオーバーフローとなります。乗算の場合は少し分かりにくいですが、これはオーバーフロー時の不等式max < a * bを式変形した結果と考えれば分かりやすいです。


About me
Creative Commons License

The source code of this blog is published on GitHub.