|
|
Basic types | |||||||||||||||||||||
Fixed width integer types(C++11) | |||||||||||||||||||||
Fixed width floating-point types(C++23) | |||||||||||||||||||||
| |||||||||||||||||||||
Numeric limits | |||||||||||||||||||||
C numeric limits interface | |||||||||||||||||||||
Runtime type information | |||||||||||||||||||||
|
Static constants | ||||
numeric_limits::is_modulo | ||||
(C++11) | ||||
Static member functions | ||||
(C++11) | ||||
Helper types | ||||
staticconstbool is_modulo; | (until C++11) | |
staticconstexprbool is_modulo; | (since C++11) | |
The value ofstd::numeric_limits<T>::is_modulo istrue for all arithmetic typesT
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 ofmax()- min()+1.
is_modulo
isfalse for signed integer types, unless the implementation defines signed integer overflow to wrap.
Contents |
T | value ofstd::numeric_limits<T>::is_modulo |
/* non-specialized */ | false |
bool | false |
char | implementation-defined |
signedchar | implementation-defined |
unsignedchar | true |
wchar_t | implementation-defined |
char8_t(since C++20) | true |
char16_t(since C++11) | true |
char32_t(since C++11) | true |
short | implementation-defined |
unsignedshort | true |
int | implementation-defined |
unsignedint | true |
long | implementation-defined |
unsignedlong | true |
longlong(C++11) | implementation-defined |
unsignedlonglong(C++11) | true |
float | false |
double | false |
longdouble | false |
The standard said "On most machines, this istrue for signed integers." before the resolution ofLWG issue 2422. SeeGCC PR 22200 for a related discussion.
Demonstrates the behavior of modulo types:
#include <iostream>#include <type_traits>#include <limits> template<class T>typenamestd::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<unsignedlong>();// check_overflow<float>(); // compile-time error, not a modulo type}
Possible output:
max value is 2147483647min value is -2147483648max value + 1 is -2147483648 max value is 18446744073709551615min value is 0max value + 1 is 0
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
DR | Applied to | Behavior as published | Correct behavior |
---|---|---|---|
LWG 612 | C++98 | the definition of "handle overflows with modulo arithmetic" was poor[1] | provided a better definition |
LWG 2422 | C++98 | is_modulo was required to betrue forsigned integer types on most machines | required to befalse for signed integer types unless signed integer overflow is defined to wrap |
[static] | identifies integer types (public static member constant)[edit] |
[static] | identifies the IEC 559/IEEE 754 floating-point types (public static member constant)[edit] |
[static] | identifies exact types (public static member constant)[edit] |