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
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.
4
https://stackoverflow.com/questions/2633661/how-to-check-integer-overflow-in-c#2633929
Tak zazwyczaj się to robi.
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() };
}