Non riesco davvero a trovare una fonte "autorevole" su questo argomento, soprattutto perché questa è probabilmente una questione di convenzione e la terminologia è spesso molto incoerente. Ma il seguente estratto del " Secure Coding in C e C ++ " di Robert Seacord riassume la mia comprensione della situazione:
Si verifica un overflow di numeri interi quando un numero intero viene aumentato oltre il valore massimo o diminuito oltre il valore minimo 3 . Gli overflow di numeri interi sono strettamente correlati alla rappresentazione sottostante.
La nota a piè di pagina continua dicendo:
[3] La riduzione di un numero intero oltre il suo valore minimo viene spesso definita underflow di numero intero , sebbene tecnicamente questo termine si riferisca a una condizione in virgola mobile.
Il motivo per cui lo chiamiamo overflow di numeri interi è perché non c'è abbastanza spazio disponibile nel tipo per rappresentare il valore. In questo senso, è simile a un buffer overflow (tranne che invece di attraversare effettivamente il limite del buffer, di solito mostra un comportamento avvolgente. *) Da questo punto di vista, non vi è alcuna differenza concettuale tra INT_MIN - 1
e INT_MAX + 1
. In entrambi i casi semplicemente non c'è abbastanza spazio nel int
tipo di dati per rappresentare entrambi i valori, quindi quello che abbiamo è un overflow .
Potrebbe anche essere utile notare che nelle architetture del processore x86 e x86_64, il registro dei flag include un bit di overflow . Il bit di overflow viene impostato quando trabocca un'operazione aritmetica di numeri interi con segno. L'espressione INT_MIN - 1
imposterà il bit di overflow. (Non esiste un bit "underflow"). Quindi, chiaramente gli ingegneri di AMD e Intel usano il termine "overflow" per descrivere il risultato di un'operazione aritmetica intera che ha troppi bit per adattarsi al tipo di dati, indipendentemente dal fatto che il il valore è numericamente troppo grande o troppo piccolo.
* In effetti, in C, l'overflow di numeri interi con segno è in realtà un comportamento indefinito, ma in altri linguaggi come Java, l'aritmetica del complemento dei due andrà a finire.
INT_MIN - 1
oINT_MAX + 1