std::numeric_limits<T>:: is_modulo
|
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 |
-
↑
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) |