Wpis z mikrobloga

#programowanie #cpp #cplusplus

Jak ogarnąć przepełnienia zmiennych? Np. przypisuję do short dużą liczbę i chcę żeby tam znalazło się maksimum zakresu, a nie jakaś inna liczba, zależnie od tego jak mocno jest przepełniona.

Patrzę w te internety i słabo, więc na razie ogarniam to przez kilka if'ów, ale wydaje się mi to bez sensu

if (a+b*c/d > 32767)
x = 32767;
else
x = a+b*c/d;
Po co kod się ma wykonywać 2 razy i jako że mam dłuższe nazwy zmiennych i dłuższe równania to powstają mi molochy w tych ifach.
  • 10
@majsterkong: Jeśli operujesz na

short
, to najprościej będzie powiększyć zakres do

int
, przy czym kod Ci się uprości do:

int foo = a+b*c/d;

if ( foo > 0x7fff )

foo = 0x7fff;

Jeśli z jakiś dziwnych przyczyn nie chcesz/nie możesz tego zrobić, to nie zostaje Ci nic innego jak sprawdzać przepełnienie przed operacją.

https://www.securecoding.cert.org/confluence/display/seccode/INT32-C.+Ensure+that+operations+on+signed+integers+do+not+result+in+overflow
@psychob: Wpadłem na takie same rozwiązanie jak napisałeś i wyciągnąłem to do zewnętrznej funkcji, która mi to kontroluje, kod trochę się wyczyścił.

Ale miałem taką cichą nadzieję na jakąś bardzo sprytną funkcje, bo taki przypadek wydaje mi się dość łatwy do zaistnienia czyli sprytna funkcja by się przydała.

Tak czy siak, dzięki wszystkim.