Namespaces
Variants

std::numeric_limits<T>:: is_modulo

From cppreference.net
Utilities library
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
  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)