Namespaces
Variants

std::numeric_limits<T>:: is_modulo

From cppreference.net
Utilities library
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
  1. 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)