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?
Przekroczenie zakresu podczas dodawania.
- Rejestracja: dni
- Ostatnio: dni
- Rejestracja: dni
- Ostatnio: dni
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.
- Rejestracja: dni
- Ostatnio: dni
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.
- Rejestracja: dni
- Ostatnio: dni
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.
- Rejestracja: dni
- Ostatnio: dni
if(suma<a) printf("O Boże, przepełnienie");
- Rejestracja: dni
- Ostatnio: dni
Dla typów signed to działa. Dla typów unsigned tylko w jedną stronę: ujemna suma => przepełnienie.
- Rejestracja: dni
- Ostatnio: dni
- Postów: 23
co to znaczy "ujemna suma"? Jak masz unsigned to masz liczby nieujemne.
- Rejestracja: dni
- Ostatnio: dni
Zgoda, to jak dla typów unsigned rozpoznać przepełnienie?
- Rejestracja: dni
- Ostatnio: dni
- Postów: 23
<quote=Zjarek>if(suma<a) printf("O Boże, przepełnienie");</quote>
- Rejestracja: dni
- Ostatnio: dni
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");