Mamy dwie liczby a i b stałoprzecinkowe, nieujemne tego samego typu (byte, int, long), suma=(ewentualne rzutowanie)(a+b). Czy równość (suma)-a==b dowodzi, że podczas dodawania nie wystąpiło przepełnienie?
a jaki masz problem żeby to sprawdzić?
Dla typu short (dwa bajty) sprawdziłem, zapisałem do pliku wszystkie pary a, b które nie przeszły tego kryterium. Były to tylko oczekiwane pary. Taka metoda sprawdzania dla typu long wydaje mi się niewłaściwa.
jeśli typeof(suma) == typeof(a) i suma, a, b są typu liczb nieujemnych oraz a + b wychodzi poza zakres, to suma - b również wyjdzie poza zakres. w każdym pozostałym przypadku jeśli suma, a i b są tego samego typu to jeśli a + b = suma, to suma - b =a.
a wiesz, że i tak przy dodawaniu albo odejmowaniu poleci wyjątek? brak wyjątku dowodem na poprawne wykonanie działania.
Nie zakładam, że liczby a i b są typu unsigned, zakładam tylko, że a,b>=0. Kryterium dla typu signed long jest niedobre:
a=9223372036854775702
b=9223372036854775724
suma=-190
suma-a=9223372036854775724
Dla typu signed int też nie działa.
Mam zatem pytanie o właściwe kryterium sprawdzania czy nastąpi (nastąpiło) przepełnienie.
if(suma<a) printf("O Boże, przepełnienie");
Dla typów signed to działa. Dla typów unsigned tylko w jedną stronę: ujemna suma => przepełnienie.
co to znaczy "ujemna suma"? Jak masz unsigned to masz liczby nieujemne.
Zgoda, to jak dla typów unsigned rozpoznać przepełnienie?
<quote=Zjarek>if(suma<a) printf("O Boże, przepełnienie");</quote>
Pora iść na spacer. Trochę mnie usprawiedliwia to, że w poście @Zjarka widziałem takie coś
if(suma<0) printf("O Boże, przepełnienie");
if ((numeric_limits<typeof(a)>::max() - a) < b) {...}