Integer jest przepełnienie kanoniczny przykład "niezdefiniowanego zachowania" w C (zauważając, że operacje na liczbach całkowitych bez znaku nigdy się nie przepełniają, są one zdefiniowane jako zawijane zamiast). Oznacza to, że po wykonaniu usługi x + y
, jeśli zostanie przepełniony, zostaniesz już zablokowany. Jest już za późno na sprawdzanie - Twój program mógł się już rozbić. Pomyśl o tym, jak o dzieleniu przez zero - jeśli poczekasz, aż podział zostanie wykonany, by sprawdzić, jest już za późno.
Oznacza to, że metoda (1) jest jedyną właściwą metodą. W przypadku max
można użyć INT_MAX
z <limits.h>
.
Jeśli x
i/lub y
może być ujemny, to rzeczy są trudniejsze - należy wykonać test w taki sposób, aby sam test nie mógł spowodować przepełnienia.
if ((y > 0 && x > INT_MAX - y) ||
(y < 0 && x < INT_MIN - y))
{
/* Oh no, overflow */
}
else
{
sum = x + y;
}
Właściwie duplikat nie jest duplikatem w ogóle, to mówimy o 'unsigned' które dobrze zdefiniowanych wraparound semantykę, natomiast przepełnione podpisaną całkowitą zachowanie jest niezdefiniowane w C. –
Nie ma potrzeby, by sprawdzić zarówno 'suma