Aktywne Wpisy
Teuvo +7
ile mieliście lat gdy pierwszy raz byliście pijani?
prawiczek92 +38
Ja idę z nią na sushi a wy zazdrośni #przegryw #przegrywpo30tce #podrywajzwykopem #pokazmorde #gdansk
Skopiuj link
Skopiuj linkWykop.pl
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.
Albo zapisz tylko najstarszy bajt. Albo zrób >>(logicznie w prawo) na zmiennej aż się zmieści?
Komentarz usunięty przez autora
A pozostałe fałszują mi wynik, równie mocno, co zwykłe przypisanie zbyt dużej liczby.
Bo akurat ten typ spełnia założenia mojej inżynierki w tym konkretnym przypadku.
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
sizeof(short) < sizeof(int)
. Jeśli tak jest, to prosta sprawa, wystarczy, ƶe porównasz pierw obliczony i zapisany do
int
a wynik z
std::numeric_limits::max()
. W przeciwnym wypadku masz problem.
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.
boost::numeric_cast