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.
Visualizziamo i Limiti
Section titled “Visualizziamo i Limiti”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 possibileui++; // ui diventa 0Questo 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.
💻 Esercizio Pratico
Section titled “💻 Esercizio Pratico”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.