Non riesco davvero a trovare una fonte "autorevole" su questo argomento, soprattutto perché si tratta probabilmente di una questione di convenzione e la terminologia è spesso molto incoerente. Tuttavia, il seguente estratto da " Secure Coding in C e C ++" di Robert Seacord riassume la mia comprensione della situazione :
An integer overflow occurs when an
integer is increased beyond its
maximum value or decreased beyond its
minimum value3. Integer overflows are
closely related to the underlying
representation.
La nota continua a dire:
[3] Decreasing an integer beyond its
minimum value is often referred to as
an integer underflow, although
technically this term refers to a
floating point condition.
Il motivo per cui chiamiamo un intero overflow è perché non c'è abbastanza spazio disponibile nel tipo per rappresentare il valore. In questo senso, è simile a un buffer overflow (eccetto piuttosto che attraversare effettivamente il limite del buffer, di solito mostra un comportamento wrap-around. *) Da questa prospettiva, non c'è alcuna differenza concettuale tra INT_MIN - 1
e INT_MAX + 1
. In entrambi i casi semplicemente non c'è abbastanza spazio nel tipo di dati int
per rappresentare entrambi i valori, quindi quello che abbiamo è un overflow .
Potrebbe anche essere utile notare che nelle architetture dei processori x86 e x86_64, il registro flags include un bit overflow . Il bit di overflow viene impostato quando si verifica un overflow di un'operazione aritmetica con numero intero con segno. L'espressione INT_MIN - 1
imposterà il bit di overflow. (Non c'è 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 valore è numericamente troppo grande o troppo piccolo.
* Infatti, in C, l'overflow dei numeri interi con segno è in realtà un comportamento non definito, ma in altri linguaggi come Java, l'aritmetica del complemento a due si avvolge.