typestar

Comportamiento indefinido: desbordamiento con signo en C

El desbordamiento con signo es indefinido: el compilador puede asumir que nunca pasa.

#include <limits.h>

/* El compilador puede asumir que a + 1 > a siempre se cumple. */
int broken_check(int a) {
    return a + 1 > a;
}

/* Correcto: pregunta antes de que ocurra la aritmética. */
int safe_check(int a) {
    return a < INT_MAX;
}

unsigned int wraps_defined(unsigned int a) {
    return a + 1u;
}

Cómo funciona

  1. La aritmética sin signo envuelve y está bien definida.
  2. El desbordamiento con signo deja al optimizador borrar tu verificación.
  3. Así que prueba antes de la suma, nunca después.

Palabras clave y builtins usados aquí

El intento, en números

Líneas
15
Caracteres a escribir
302
Tokens
48
Ritmo de tres estrellas
105 tpm

Al ritmo de tres estrellas de 105 tokens por minuto, este intento toma unos 27 segundos.

Escribe este fragmento

Paso 1 de 3 en Comportamiento indefinido; paso 8 de 13 en Uniones, campos de bits y comportamiento indefinido.

← Anterior Siguiente →