2010-06-14 16 views
5

W następującym kodzie C++, 32767 + 1 = -32768.Jak uniknąć przepełnienia liczby całkowitej?

#include <iostream> 
int main(){ 
short var = 32767; 
var++; 
std::cout << var; 
std::cin.get(); 
} 

Czy istnieje sposób, aby zostawić "var" jako 32767, bez błędów?

+0

Czy wiesz, co się tutaj dzieje? Udało ci się trafić w pułapkę na liczbę całkowitą (krótką), więc dodanie jeszcze jednego odwraca znaki do maksymalnej wartości ujemnej dla liczby całkowitej. – blu

+0

Jeśli chcesz inny tryb, w którym liczby całkowite nie są automatycznie zawijane, to nie istnieje, przepraszam. – dmazzoni

+4

To przypomina mi, dlaczego [nie mogę spać] (http://xkcd.com/571/). :-) –

Odpowiedz

29

Tak, jest:

if (var < 32767) var++; 

Nawiasem mówiąc, nie należy zakodować na stałe, należy numeric_limits<short>::max() zdefiniowane w pliku nagłówkowym <limits> zamiast.

można ująć tę funkcjonalność w szablonie funkcji:

template <class T> 
void increment_without_wraparound(T& value) { 
    if (value < numeric_limits<T>::max()) 
    value++; 
} 

i używać go lubię:

short var = 32767; 
increment_without_wraparound(var); // pick a shorter name! 
+0

Tak, to by działało ... Dziękuję! – noryb009

+0

Cóż, to było łatwe, LOL. –

+2

+1 za implementację szablonu. Bardzo sexy. – chaosTechnician

0
#include <iostream> 
int main(){ 
unsigned short var = 32767; 
var++; 
std::cout << var; 
std::cin.get(); 
} 
+1

To odpowiada na pytanie, które zadano, ale nie, podejrzewam, pytanie, które było zamierzone. –

0

stosowanie 'unsigned short int' lub 'long int'

#include <iostream> 
int main(){ 
long int var = 32767; 
var++; 
std::cout << var; 
std::cin.get(); 
} 
+0

Następnie x = 32676; x ++ da w wyniku x == 32677, a nie 32676. – geoffspear

+1

OK, więc jak można uniknąć przepełnienia niepodpisanej 64-bitowej liczby całkowitej? – Wizard79

Powiązane problemy