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()
]
liegen würde, 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 den Überlauf vorzeichenbehafteter Ganzzahlen als Wrap-Around.
Inhaltsverzeichnis |
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) |