Namespaces
Variants

std::numeric_limits<T>::is_modulo

Depuis fr.cppreference.net
 
 
Bibliothèque d'utilitaires
Support langage
Support des types (types de base, RTTI)
Macros de test de fonctionnalités de la bibliothèque (C++20)
Utilitaires de programme
Fonctions variadiques
Support des coroutines (C++20)
Support des contrats (C++26)
Comparaison à trois voies
(C++20)
(C++20)(C++20)(C++20)    
(C++20)(C++20)(C++20)

Utilitaires généraux
Opérateurs relationnels (déprécié en C++20)
 
Support des types
Types de base
Types entiers à largeur fixe (C++11)
Types à virgule flottante à largeur fixe (C++23)
(C++11)    
(C++17)
Limites numériques
Interface des limites numériques C
Informations sur le type au moment de l'exécution
 
 
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ébordements avec une arithmétique modulo, c'est-à-dire si le résultat d'une addition, d'une soustraction, d'une multiplication ou d'une division de ce type sort de l'intervalle [min()max()], la valeur renvoyé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ébordement d'entier signé comme un wrapping.

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)