0Pricing
C++ Academy · Lección

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áximo
  • min() — valor mínimo (positivo)
  • lowest() — valor más negativo
  • epsilon() — 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 happen

Desbordamiento 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;  // inf

Detecció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.cpp

Comprobació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

  1. Tipos enteros frente a tipos de punto flotante
  2. La cabecera cmath: pow, sqrt, abs y round
  3. Números aleatorios con la cabecera random
  4. Límites numéricos y comportamiento de overflow
← Volver a C++ Academy