Namespaces
Variants

std::numeric_limits<T>:: is_modulo

From cppreference.net
Utilities library
static const bool is_modulo ;
(jusqu'à C++11)
static constexpr bool is_modulo ;
(depuis C++11)

La valeur de std:: numeric_limits < T > :: is_modulo est true pour tous les types arithmétiques T qui gèrent les dépassements avec l'arithmétique modulo, c'est-à-dire que si le résultat d'une addition, soustraction, multiplication ou division de ce type sortirait de l'intervalle [ min() , max() ] , la valeur retournée par une telle opération diffère de la valeur attendue par un multiple de max ( ) - min ( ) + 1 .

is_modulo est false pour les types entiers signés, sauf si l'implémentation définit le dépassement d'entier signé comme étant cyclique.

Table des matières

Spécialisations standards

T valeur de std:: numeric_limits < T > :: is_modulo
/* non spécialisée */ false
bool false
char défini par l'implémentation
signed char défini par l'implémentation
unsigned char true
wchar_t défini par l'implémentation
char8_t (depuis C++20) true
char16_t (depuis C++11) true
char32_t (depuis C++11) true
short défini par l'implémentation
unsigned short true
int défini par l'implémentation
unsigned int true
long défini par l'implémentation
unsigned long true
long long (C++11) défini par l'implémentation
unsigned long long (C++11) true
float false
double false
long double false

Notes

La norme indiquait « Sur la plupart des machines, ceci est true pour les entiers signés. » avant la résolution de LWG issue 2422 . Voir GCC PR 22200 pour une discussion connexe.

Exemple

Illustre le comportement des types modulo :

#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
}

Sortie possible :

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

Rapports de défauts

Les rapports de défauts modifiant le comportement suivants ont été appliqués rétroactivement aux normes C++ précédemment publiées.

DR Applicable à Comportement publié Comportement corrigé
LWG 612 C++98 la définition de "gestion des dépassements
par arithmétique modulaire" était inadéquate [1]
fourni une
meilleure définition
LWG 2422 C++98 is_modulo devait être true pour
les types entiers signés sur la plupart des machines
doit être false pour les types entiers signés
sauf si le dépassement d'entier signé est défini pour boucler
  1. La définition est "l'addition de deux nombres positifs peut avoir un résultat qui boucle vers un troisième nombre qui est inférieur". Elle présente les problèmes suivants :
    • Elle ne définit pas la valeur enveloppée.
    • Elle ne précise pas si le résultat est reproductible.
    • Elle n'exige pas que l'exécution d'additions, de soustractions et d'autres opérations sur toutes les valeurs ait un comportement défini.

Voir aussi

[static]
identifie les types entiers
(constante de membre public static)
[static]
identifie les types à virgule flottante IEC 559/IEEE 754
(constante de membre public static)
[static]
identifie les types exacts
(constante de membre public static)