Límites numéricos y comportamiento de overflow
Consulte std::numeric_limits y comprenda las reglas de overflow con signo y sin signo.
Límites numéricos y comportamiento de overflow es una lección gratuita de C++ Academy en CoddyKit. Esta es la lección 4 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de C++ Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de C++ Academy incluye 4 lecciones en total.
Por qué importan los límites
Cada tipo numérico tiene un valor máximo y mínimo representable. Superarlos puede producir silenciosamente resultados incorrectos o incluso un comportamiento indefinido.
std::numeric_limits
Consulte los límites de cualquier tipo numérico con el encabezado <limits>. Son constantes evaluadas en tiempo de compilación, sin coste en tiempo de ejecución.
#include <limits>
std::cout << std::numeric_limits<int>::max() << "\n";
std::cout << std::numeric_limits<int>::min() << "\n";
std::cout << std::numeric_limits<double>::epsilon();Consultas habituales
Los miembros más útiles:
max()— valor máximomin()— valor mínimo (positivo)lowest()— valor más negativoepsilon()— diferencia mínima significativa (para flotantes)digits10— cantidad de dígitos decimales garantizados
Desbordamiento de enteros con signo
El desbordamiento de enteros con signo es un comportamiento indefinido. El compilador puede suponer que nunca ocurre, lo que puede dar lugar a optimizaciones sorprendentes.
int x = std::numeric_limits<int>::max();
x += 1; // UB — anything can happenDesbordamiento circular de enteros sin signo
El desbordamiento de enteros sin signo está definido: los valores dan la vuelta módulo 2^N. A veces resulta útil, pero a menudo es una fuente de errores.
unsigned int u = 0;
u -= 1; // wraps to 4,294,967,295 (UINT_MAX)Desbordamiento y subdesbordamiento de flotantes
Los flotantes sufren un desbordamiento hacia inf en lugar de provocar un fallo. El subdesbordamiento produce números subnormales o 0.
double x = 1e308;
x *= 100;
std::cout << x; // infDetección segura del desbordamiento
Para enteros con signo, compruebe el valor antes de realizar la operación. Los compiladores proporcionan funciones integradas de aritmética comprobada, como __builtin_add_overflow en GCC/Clang.
if (a > std::numeric_limits<int>::max() - b) {
// overflow would happen
}
int sum = a + b;C++20 std::ssize y std::cmp_less
C++20 añade funciones auxiliares seguras para comparar enteros en <utility>: std::cmp_equal, cmp_less y cmp_greater. Gestionan correctamente las combinaciones de tipos con y sin signo.
Las conversiones implícitas son engañosas
Mezclar valores con y sin signo en una comparación convierte silenciosamente el operando con signo a un tipo sin signo, una fuente habitual de errores sutiles.
int a = -1;
unsigned int b = 1;
if (a < b) std::cout << "yes";
else std::cout << "no"; // prints "no"!Comprobaciones en tiempo de compilación
Use static_assert para imponer supuestos sobre los tamaños al escribir código portable.
static_assert(sizeof(int) >= 4, "Need at least 32-bit int");Los sanitizadores ayudan en las pruebas
Compile con -fsanitize=undefined para detectar desbordamientos de enteros con signo en tiempo de ejecución durante las pruebas.
g++ -fsanitize=undefined -O1 main.cppComprobación rápida
¿Qué ocurre cuando una suma de enteros con signo sufre un desbordamiento en C++?
Resumen
Use std::numeric_limits para consultar los límites de los tipos. El desbordamiento con signo es indefinido; los tipos sin signo dan la vuelta. Mezcle valores con y sin signo bajo su propia responsabilidad. Los sanitizadores y las comparaciones seguras de C++20 ayudan a proteger el código.
Preguntas frecuentes
¿La lección «Límites numéricos y comportamiento de overflow» es gratis?
Sí — el texto completo de «Límites numéricos y comportamiento de overflow» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de C++ Academy, actualiza a CoddyKit PRO. El curso de C++ Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Límites numéricos y comportamiento de overflow»?
Consulte std::numeric_limits y comprenda las reglas de overflow con signo y sin signo. Practicas C++ Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar C++ Academy?
No se requiere experiencia previa. C++ Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 4 de 4.
¿Cuánto tiempo toma la lección «Límites numéricos y comportamiento de overflow»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de C++ Academy?
Sí. Cada lección de C++ Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Tipos enteros frente a tipos de punto flotante
- La cabecera cmath: pow, sqrt, abs y round
- Números aleatorios con la cabecera random
- Límites numéricos y comportamiento de overflow