2010-06-14 25 views
5

En el siguiente código de C++, 32767 + 1 = -32768.Cómo evitar el desbordamiento de enteros?

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

¿Hay alguna manera de simplemente dejar "var" como 32767, sin ningún error?

+0

¿Qué está pasando aquí? Ha llegado al techo por un número entero (corto), por lo que al agregar uno más, los signos se vuelven a la cantidad máxima negativa para un número entero. – blu

+0

Si desea un modo diferente donde los números enteros no se envuelven automáticamente, no existe, lo siento. – dmazzoni

+4

Esto me recuerda por qué [no puedo dormir] (http://xkcd.com/571/). :-) –

Respuesta

29

Sí, hay:

if (var < 32767) var++; 

Por cierto, no se debe codificar la constante, utilizar numeric_limits<short>::max() definido en <limits> archivo de cabecera en su lugar.

Puede encapsular esta funcionalidad en una plantilla de función:

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

y usarlo como:

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

Sí, eso funcionaría ... ¡Gracias! – noryb009

+0

Bueno, eso fue fácil, LOL. –

+2

+1 para la implementación de la Plantilla. Muy sexy. – chaosTechnician

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

Esto responde la pregunta que se hizo, pero no, sospecho, la pregunta que se pretendía. –

0

uso 'unsigned short int' o 'long int'

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

Luego x = 32676; x ++ dará como resultado x == 32677, no 32676. – geoffspear

+1

OK, entonces, ¿cómo evitar el desbordamiento en un entero sin signo de 64 bits? – Wizard79

Cuestiones relacionadas