Límites y desbordamiento en C
Cada tipo entero tiene un rango; cruzarlo envuelve o es comportamiento indefinido.
#include <limits.h>
#include <stdio.h>
int safe_add(int a, int b, int *out) {
if (b > 0 && a > INT_MAX - b) {
return 0;
}
if (b < 0 && a < INT_MIN - b) {
return 0;
}
*out = a + b;
return 1;
}
void limits(void) {
printf("int %d..%d\n", INT_MIN, INT_MAX);
printf("unsigned max %u\n", UINT_MAX);
unsigned char wraps = 255;
wraps++;
printf("wrapped to %u\n", wraps);
int result = 0;
printf("%d\n", safe_add(INT_MAX, 1, &result));
}
Cómo funciona
<limits.h>nombra los límites de cada tipo.- La aritmética sin signo envuelve; el desbordamiento con signo es comportamiento indefinido.
- Verifica antes de sumar, no después.
Palabras clave y builtins usados aquí
charifintreturnunsignedvoid
El intento, en números
- Líneas
- 25
- Caracteres a escribir
- 431
- Tokens
- 139
- Ritmo de tres estrellas
- 80 tpm
Al ritmo de tres estrellas de 80 tokens por minuto, este intento toma unos 104 segundos.
Paso 6 de 7 en Variables y tipos; paso 6 de 35 en Fundamentos del lenguaje.