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 Modulo-Arithmetik behandeln, das heißt, wenn das Ergebnis einer Addition, Subtraktion, Multiplikation oder Division dieses Typs außerhalb des Bereichs [min(), max()] liegt, weicht der von dieser Operation zurückgegebene Wert vom erwarteten Wert um ein Vielfaches von max() - min() + 1 ab.
is_modulo ist false für vorzeichenbehaftete Ganzzahltypen, es sei denn, die Implementierung definiert Überläufe von vorzeichenbehafteten Ganzzahlen als zyklisch.
Inhalt |
[bearbeiten] Standard-Spezialisierungen
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 |
[bearbeiten] Anmerkungen
Der Standard besagte "Auf den meisten Maschinen ist dies für vorzeichenbehaftete Ganzzahlen true" vor der Behebung von LWG-Problem 2422. Siehe GCC PR 22200 für eine verwandte Diskussion.
[bearbeiten] 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
[bearbeiten] Fehlerberichte
Die folgenden Verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | angewendet auf | Verhalten wie veröffentlicht | Korrigiertes Verhalten |
|---|---|---|---|
| LWG 612 | C++98 | die Definition von "behandelt Überläufe mit Modulo-Arithmetik" war mangelhaft[1] |
bot eine bessere Definition |
| LWG 2422 | C++98 | is_modulo sollte fürvorzeichenbehaftete Ganzzahltypen auf den meisten Maschinen true sein |
sollte für vorzeichenbehaftete Ganzzahltypen false sein es sei denn, Überläufe von vorzeichenbehafteten Ganzzahlen sind als zyklisch definiert |
- ↑ Die Definition lautet "das Addieren zweier positiver Zahlen kann zu einem Ergebnis führen, das zu einer dritten Zahl umbricht, die kleiner ist". Sie hat die folgenden Probleme:
- Sie definiert nicht den umgebrochenen Wert.
- Sie gibt nicht an, ob das Ergebnis wiederholbar ist.
- Sie verlangt nicht, dass das Ausführen von Addition, Subtraktion und anderen Operationen auf allen Werten definiertes Verhalten hat.
[bearbeiten] Siehe auch
| [static] |
identifiziert Ganzzahltypen (öffentliche statische Member-Konstante) |
| [static] |
identifiziert die IEC 559/IEEE 754 Gleitkommatypen (öffentliche statische Member-Konstante) |
| [static] |
identifiziert exakte Typen (öffentliche statische Member-Konstante) |