Skip to content

Wraparound e Overflow

Cosa succede se aggiungi 1 a una variabile che è già al suo valore massimo consentito in memoria? In matematica avresti un numero più grande, ma in C le variabili hanno limiti fisici. La risposta cambia drasticamente a seconda che la variabile sia unsigned o signed.

Unsigned Wraparound (Comportamento Definito)

Section titled “Unsigned Wraparound (Comportamento Definito)”

Se un’operazione su un tipo unsigned produce un risultato troppo grande (o un numero negativo), il C applica il Wraparound (avvolgimento). Il valore ricomincia da zero (come il contachilometri di un’auto).

unsigned int ui = UINT_MAX; // Massimo valore possibile
ui++; // ui diventa 0

Questo comportamento è al 100% lecito in C (ben definito), ma può causare difetti logici.

Inoltre, un numero unsigned non può mai essere negativo. Questo ciclo for causerà un loop infinito:

// i non sarà mai < 0, quando scende sotto lo zero, wrappa a UINT_MAX!
for (unsigned int i = 10; i >= 0; i--) { ... }

Signed Overflow (Comportamento NON Definito - UB)

Section titled “Signed Overflow (Comportamento NON Definito - UB)”

Cosa succede se sfori la grandezza massima (o minima) di un tipo signed (con segno)? In questo caso, il C dichiara l’evento un Undefined Behavior (UB).

L’overflow dei numeri signed è considerato un grave errore di programmazione.

Verifichiamo il wraparound. Usa la macro UINT_MAX (inclusa da <limits.h>) per assegnare il valore massimo alla variabile x, dopodiché aggiungi 1 e stampane il valore.