Przekroczenie zakresu podczas dodawania.

0

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?

0

a jaki masz problem żeby to sprawdzić?

0

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.

0

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.

0

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.

0

if(suma<a) printf("O Boże, przepełnienie");

1

Dla typów signed to działa. Dla typów unsigned tylko w jedną stronę: ujemna suma => przepełnienie.

0

co to znaczy "ujemna suma"? Jak masz unsigned to masz liczby nieujemne.

1

Zgoda, to jak dla typów unsigned rozpoznać przepełnienie?

0

<quote=Zjarek>if(suma<a) printf("O Boże, przepełnienie");</quote>

0

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");

0
if ((numeric_limits<typeof(a)>::max() - a) < b) {...}

1 użytkowników online, w tym zalogowanych: 0, gości: 1