Namensräume
Varianten
Aktionen

std::numeric_limits<T>::is_modulo

Von cppreference.com
 
 
Dienstprogramm-Bibliotheken
Sprachunterstützung
Typunterstützung (Basistypen, RTTI)
Bibliotheks-Feature-Test-Makros (C++20)
Programm-Dienstprogramme
Variadische Funktionen
Coroutine-Unterstützung (C++20)
Vertragsunterstützung (C++26)
Drei-Wege-Vergleich
(C++20)
(C++20)(C++20)(C++20)  
(C++20)(C++20)(C++20)

Allgemeine Hilfsmittel
Relationale Operatoren (in C++20 veraltet)
 
 
 
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ür
vorzeichenbehaftete 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
  1. 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) [bearbeiten]
[static]
identifiziert die IEC 559/IEEE 754 Gleitkommatypen
(öffentliche statische Member-Konstante) [bearbeiten]
[static]
identifiziert exakte Typen
(öffentliche statische Member-Konstante) [bearbeiten]