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
This blog's source code is published on GitHub.