Namespaces
Variants

std::numeric_limits<T>::is_modulo

De es.cppreference.net
 
 
Biblioteca de utilidades
Soporte del lenguaje
Soporte de tipos (tipos básicos, RTTI)
Macros de prueba de características de la biblioteca (C++20)
Utilidades de programa
Funciones variádicas
Soporte de corrutinas (C++20)
Soporte de contratos (C++26)
Comparación tripartita
(C++20)
(C++20)(C++20)(C++20)    
(C++20)(C++20)(C++20)

Utilidades generales
Operadores relacionales (obsoleto en C++20)
 
Soporte de tipos
Tipos básicos
Tipos enteros de ancho fijo (C++11)
Tipos de punto flotante de ancho fijo (C++23)
(C++11)    
(C++17)
Límites numéricos
Interfaz de límites numéricos de C
Información de tipo en tiempo de ejecución
 
 
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 una suma, resta, multiplicación o división de este tipo cae fuera del rango [min(), max()], el valor devuelto por dicha operación difiere del valor esperado en un múltiplo de max() - min() + 1.

is_modulo es false para tipos enteros con signo, a menos que la implementación defina el desbordamiento de enteros con signo como envolvente.

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
  1. ↑ 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)