integer overflow è il esempio canonico di "comportamento indefinito" in C (osservando che le operazioni su interi non firmati non si sovrappongono mai, sono invece definite per il wrap-around). Ciò significa che, una volta eseguito x + y
, se è in overflow, sei già in difficoltà. È troppo tardi per fare qualche controllo - il tuo programma potrebbe essersi già schiantato. Pensa ad un controllo per divisione per zero - se aspetti fino a dopo che la divisione è stata eseguita per controllare, è già troppo tardi.
Quindi questo implica che il metodo (1) è l'unico modo corretto per farlo. Per max
, è possibile utilizzare INT_MAX
da <limits.h>
.
Se x
e/o possono essere negativi, le cose sono più difficili: è necessario eseguire il test in modo che il test non possa causare un overflow.
if ((y > 0 && x > INT_MAX - y) ||
(y < 0 && x < INT_MIN - y))
{
/* Oh no, overflow */
}
else
{
sum = x + y;
}
In realtà il duplicato non è un duplicato a tutti, sta parlando di 'unsigned' che sono ben definiti semantica avvolgenti, mentre traboccante un intero con segno è un comportamento indefinito in C. –
Non v'è alcuna necessità di controllare sia 'sum