std::numeric_limits<T>:: is_modulo
|
static
const
bool
is_modulo
;
|
(hasta C++11) | |
|
static
constexpr
bool
is_modulo
;
|
(desde C++11) | |
El valor de
std::
numeric_limits
<
T
>
::
is_modulo
es
true
para todos los tipos aritméticos
T
que manejan desbordamientos con aritmética modular, es decir, si el resultado de suma, resta, multiplicación o división de este tipo caería fuera del rango
[
min()
,
max()
]
, el valor devuelto por dicha operación difiere del valor esperado por un múltiplo de
max
(
)
-
min
(
)
+
1
.
is_modulo
es
false
para tipos enteros con signo, a menos que la implementación defina que el desbordamiento de enteros con signo se ajuste.
Contenidos |
Especializaciones estándar
T
|
valor de std:: numeric_limits < T > :: is_modulo |
| /* non-specialized */ | false |
| bool | false |
| char | definido por la implementación |
| signed char | definido por la implementación |
| unsigned char | true |
| wchar_t | definido por la implementación |
| char8_t (desde C++20) | true |
| char16_t (desde C++11) | true |
| char32_t (desde C++11) | true |
| short | definido por la implementación |
| unsigned short | true |
| int | definido por la implementación |
| unsigned int | true |
| long | definido por la implementación |
| unsigned long | true |
| long long (C++11) | definido por la implementación |
| unsigned long long (C++11) | true |
| float | false |
| double | false |
| long double | false |
Notas
El estándar decía "En la mayoría de las máquinas, esto es true para enteros con signo." antes de la resolución de LWG issue 2422 . Consulte GCC PR 22200 para una discusión relacionada.
Ejemplo
Demuestra el comportamiento de los tipos módulo:
#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 }
Salida posible:
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
Informes de defectos
Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.
| DR | Se aplica a | Comportamiento publicado | Comportamiento correcto |
|---|---|---|---|
| LWG 612 | C++98 |
la definición de "manejar desbordamientos
con aritmética modular" era deficiente [1] |
se proporcionó una
mejor definición |
| LWG 2422 | C++98 |
is_modulo
se requería que fuera
true
para
tipos enteros con signo en la mayoría de máquinas |
se requiere que sea
false
para tipos enteros con signo
a menos que el desbordamiento de enteros con signo esté definido para envolver |
-
↑
La definición es "sumar dos números positivos puede tener un resultado que se desborda hacia un tercer número que es menor". Tiene los siguientes problemas:
- No define el valor desbordado.
- No establece si el resultado es repetible.
- No requiere que realizar suma, resta y otras operaciones con todos los valores tenga un comportamiento definido.
Véase también
|
[static]
|
identifica tipos enteros
(constante de miembro público estático) |
|
[static]
|
identifica los tipos de punto flotante IEC 559/IEEE 754
(constante de miembro público estático) |
|
[static]
|
identifica tipos exactos
(constante de miembro público estático) |