HOWTO · C++

Expresiones de macro INT_MAX e INT_MIN en C++

Este artículo presenta cómo utilizar las expresiones de macro INT_MAX e INT_MIN en C++

En esta página

INT_MIN y INT_MAX son, respectivamente, el menor y el mayor valor que el tipo int puede representar en una implementación. Incluye <climits> para usar estas macros en C++; como sus valores dependen de la implementación, consúltalos en lugar de asumir los números de una plataforma concreta.

Qué significan INT_MIN e INT_MAX en C++

Estas dos macros describen el rango de int: INT_MIN es el límite inferior y INT_MAX, el superior. La implementación de C++ determina ese rango; no se garantiza que todas las máquinas usen los mismos valores numéricos. Las macros se aplican a int, no describen los tipos long, short ni los enteros sin signo. El encabezado <climits> también proporciona macros relacionadas, como LONG_MIN, LONG_MAX y UINT_MAX, para cuando necesites esos tipos.

Las macros permiten que el código consulte los límites reales que establece la implementación. Esto es más portable que incluir un valor decimal conocido en una comparación o definición de rango. Indican los límites, pero por sí solas no hacen que las operaciones aritméticas sean seguras.

Consultar los límites de los enteros con <climits>

Incluye <climits> para usar las macros de límites de los enteros. Este ejemplo completo muestra los dos límites de int sin asumir valores decimales concretos:

Ejecuta este ejemplo:

El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.

#include <climits>
#include <iostream>

int main() {
  std::cout << "INT_MIN = " << INT_MIN << '\n';
  std::cout << "INT_MAX = " << INT_MAX << '\n';
}
INT_MIN = -2147483648
INT_MAX = 2147483647

Estos son los valores observados en el entorno probado; tu implementación puede mostrar límites distintos. Si necesitas los límites de otro tipo entero, usa su macro correspondiente de <climits> en lugar de reutilizar los límites de int.

Generar un valor int aleatorio en todo su rango

std::uniform_int_distribution<int> acepta límites inferior y superior inclusivos. Por tanto, pasar INT_MIN y INT_MAX solicita valores de todo el rango de int. Un motor aleatorio proporciona la secuencia y la distribución asigna los resultados del motor al rango solicitado.

Ejecuta este ejemplo:

El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.

#include <climits>
#include <iostream>
#include <random>

int main() {
  std::mt19937 engine(42);
  std::uniform_int_distribution<int> distribution(INT_MIN, INT_MAX);

  for (int count = 0; count < 5; ++count) {
    std::cout << distribution(engine) << '\n';
  }
}
-538846106
1273642419
1935803228
-1359637234
996406378

Esta muestra corresponde a la salida observada en el entorno probado. La semilla fija permite repetir el estado inicial del motor, pero los valores concretos de la distribución pueden variar entre implementaciones de la biblioteca estándar, ya que los algoritmos de distribución no tienen que producir la misma secuencia en todas partes. Si la aplicación necesita una semilla no determinista, inicializa el motor desde una fuente adecuada; evita crear un motor nuevo para cada valor generado.

Usar los límites de los enteros de forma segura

Una macro de límite resulta útil para validar un valor o describir un rango permitido, pero comprobar el resultado después de una operación que ya se desbordó es demasiado tarde. Para sumar valores int no negativos, comprueba a <= INT_MAX - b antes de evaluar a + b. Para restar, analiza los límites inferior y superior antes de calcular: en las implementaciones cuyo rango es asimétrico, negar INT_MIN no se puede representar como un valor int. En C++, el desbordamiento de un entero con signo tiene comportamiento indefinido, así que no debes confiar en que la operación dé la vuelta a otro valor.

Si un cálculo puede superar el rango de int, elige un tipo con rango suficiente o usa aritmética comprobada antes de realizar la operación. El tipo más ancho también debe poder representar el resultado del cálculo. INT_MIN y INT_MAX son valores límite útiles para las pruebas y las comprobaciones, pero no evitan el desbordamiento si la lógica circundante no valida las entradas antes de operar.