std::numeric_limits<T>::is_modulo

The value of std::numeric_limits::is_modulo is true for all arithmetic types T that handle overflows with modulo arithmetic, that is, if the result of addition, subtraction, multiplication, or division of this type would fall outside the range [min(),max()], the value returned by such operation differs from the expected value by a multiple of max() - min() + 1.

# Declarations

static const bool is_modulo;

(until C++11)

static constexpr bool is_modulo;

(since C++11)

# Notes

The standard said “On most machines, this is true for signed integers.” before the resolution of LWG issue 2422. See GCC PR 22200 for a related discussion.

# Example

#include <iostream>
#include <type_traits>
#include <limits>
 
template<class T>
typename std::enable_if<std::numeric_limits<T>::is_modulo>::type
    check_overflow()
{
    std::cout << "max value is " << std::numeric_limits<T>::max() << '\n'
              << "min value is " << std::numeric_limits<T>::min() << '\n'
              << "max value + 1 is " << std::numeric_limits<T>::max()+1 << '\n';
}
 
int main()
{
    check_overflow<int>();
    std::cout << '\n';
    check_overflow<unsigned long>();
//  check_overflow<float>(); // compile-time error, not a modulo type
}

# Defect reports

DRApplied toBehavior as publishedCorrect behavior
LWG 612C++98the definition of “handle overflowswith modulo arithmetic” was poor[1]provided abetter definition
LWG 2422C++98is_modulo was required to be true forsigned integer types on most machinesrequired to be false for signed integer typesunless signed integer overflow is defined to wrap

# See also