Zabezpieczenie przed overflow w wyniku obliczeń

0

Witam
Piszę program i potrzebuję w jakiś sposób sprawdzać czy doszło do przepełnienia zmiennej z wynikiem, dokładnie chodzi mi o coś takiego (czysto hipotetycznie do zobrazowania co mam na myśli): zmienne a, b i c i których mogę maksymalnie przechowywać maksymalnie liczbę 5 (decymalnie) i teraz a=4 b=4 i w wyniku operacji c=a+b dojdzie do przepełnienia, jak się zabezpieczyć przed czym takim? Jak się zabezpieczyć przed czym takim podczas wprowadzania liczb z klawiatury wiem, ale nie wiem niestety tego o co pytam kody które znalazłem w internacie są dla mnie średnio zrozumiałe, liczę na pomoc, z góry dzięki ;)

0

Pobierz dane do string i później przekonwertuj na typ liczbowy. Jeśli wartość przekracza rozmiar dostaniesz 'out_of_range'.
https://ideone.com/HgMkR8

Są też biblioteki do obsługi dużych i precyzyjnych obliczeń jak. https://gmplib.org

0

Jeśli wynik nie jest zbytnio ważny, to możesz dobrze zrobić c = (a+b) % 6, wtedy w c będzie liczba z zakresu od 0-5.

0
template<class T>
class CheckOverflow
{
    static_assert(std::is_integral<T>::value, "only integral types are suported");
public:
    CheckOverflow(T x) 
    : mX(x) {}
    
    CheckOverflow(int x) 
    : mX((T)x) {}

    operator T() const
    {
        return mX;
    }

    auto Get() const -> T
    {
        return mX;
    }

private:
    T mX;
};

template<class T>
auto operator+(CheckOverflow<T> a, CheckOverflow<T> b)
    -> CheckOverflow<T>
{
    if ((b.Get() > 0 && a.Get() > std::numeric_limits<T>::max() - b.Get())
        || (b.Get() < 0 && a.Get() < std::numeric_limits<T>::min()- b.Get()))
    {
         throw OverfloException();
    }
    return { a.Get() + b.Get() };
}

template<class T>
auto operator-(CheckOverflow<T> a, CheckOverflow<T> b)
    -> CheckOverflow<T>
{
    if ((b.Get() < 0 && a.Get() > std::numeric_limits<T>::max() + b.Get())
        || (b.Get() > 0 && a.Get() < std::numeric_limits<T>::min() + b.Get()))
    {
         throw OverfloException();
    }
    return { a.Get() - b.Get() };
}

https://wandbox.org/permlink/5bFz5HFkaFFEalBl

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