std::numeric_limits<T>::is_modulo
static const bool is_modulo;
|
(bis C++11) | |
static constexpr bool is_modulo;
|
(seit C++11) | |
Der Wert von std::numeric_limits<T>::is_modulo ist true für alle arithmetischen Typen T, die Überläufe mit modulärer Arithmetik behandeln, d.h. wenn das Ergebnis einer Addition, Subtraktion, Multiplikation oder Division dieses Typs außerhalb des Bereichs [min(), max()] liegen würde, dann unterscheidet sich der von einer solchen Operation zurückgegebene Wert vom erwarteten Wert um ein Vielfaches von max() - min() + 1.
is_modulo ist false für vorzeichenbehaftete Ganzzahltypen, es sei denn, die Implementierung definiert, dass ein Überlauf bei vorzeichenbehafteten Ganzzahlen umschlägt.
Standardspezialisierungen
T
|
Wert von std:: numeric_limits < T > :: is_modulo |
| /* nicht spezialisiert */ | false |
| bool | false |
| char | implementierungsdefiniert |
| signed char | implementierungsdefiniert |
| unsigned char | true |
| wchar_t | implementierungsdefiniert |
| char8_t (seit C++20) | true |
| char16_t (seit C++11) | true |
| char32_t (seit C++11) | true |
| short | implementierungsdefiniert |
| unsigned short | true |
| int | implementierungsdefiniert |
| unsigned int | true |
| long | implementierungsdefiniert |
| unsigned long | true |
| long long (C++11) | implementierungsdefiniert |
| unsigned long long (C++11) | true |
| float | false |
| double | false |
| long double | false |
Hinweise
Der Standard sagte "Auf den meisten Maschinen trifft dies true für vorzeichenbehaftete Ganzzahlen zu." vor der Lösung von LWG Issue 2422 . Siehe GCC PR 22200 für eine verwandte Diskussion.
Beispiel
Demonstriert das Verhalten von Modulo-Typen:
#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 }
Mögliche Ausgabe:
max value is 2147483647 min value is -2147483648 max value + 1 is -2147483648 max value is 18446744073709551615 min value is 0 max value + 1 is 0
Fehlerberichte
Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | Angewendet auf | Verhalten wie veröffentlicht | Korrektes Verhalten |
|---|---|---|---|
| LWG 612 | C++98 |
die Definition von "handle overflows
with modulo arithmetic" war unzureichend [1] |
eine bessere Definition
bereitgestellt |
| LWG 2422 | C++98 |
is_modulo
musste
true
sein für
vorzeichenbehaftete Ganzzahltypen auf den meisten Maschinen |
muss
false
sein für vorzeichenbehaftete Ganzzahltypen
es sei denn, Überlauf vorzeichenbehafteter Ganzzahlen ist als Wrap-Around definiert |
-
↑
Die Definition lautet: "Das Addieren zweier positiver Zahlen kann zu einem Ergebnis führen, das auf eine dritte Zahl umschlägt, die kleiner ist". Sie hat folgende Probleme:
- Sie definiert nicht den umgeschlagenen Wert.
- Sie legt nicht fest, ob das Ergebnis wiederholbar ist.
- Sie erfordert nicht, dass die Ausführung von Addition, Subtraktion und anderen Operationen mit allen Werten ein definiertes Verhalten aufweist.
Siehe auch
|
[static]
|
identifiziert Ganzzahltypen
(öffentliche statische Memberkonstante) |
|
[static]
|
identifiziert IEC 559/IEEE 754 Gleitkommatypen
(öffentliche statische Memberkonstante) |
|
[static]
|
identifiziert exakte Typen
(öffentliche statische Memberkonstante) |