2010-06-14 3 views
5

다음 C++ 코드에서 32767 + 1 = -32768입니다.정수 오버 플로우를 방지하는 방법은 무엇입니까?

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

오류없이 "var"를 32767로 남겨 둘 수있는 방법이 있습니까?

+0

여기서 무슨 일이 일어나나요? 정수 (짧은 값)에 대해 천장에 도달 했으므로 하나를 더 추가하면 부호를 정수에 대한 최대 음수 값으로 넘깁니다. – blu

+0

정수가 자동으로 감싸지 않는 다른 모드를 원하면 존재하지 않습니다. 죄송합니다. – dmazzoni

+4

이것은 내가 왜 [잠들 수 없다]는 것을 상기시켜줍니다 (http://xkcd.com/571/). :-) –

답변

29

예,이 : 그런데

if (var < 32767) var++; 

, 당신은 상수를 하드 numeric_limits<short>::max() 대신 <limits> 헤더 파일에 정의 사용할 수 없습니다.

당신은 함수 템플릿에이 기능을 캡슐화 할 수

: 좋아

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

및 사용 :

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

예, 작동합니다 ... 감사합니다! – noryb009

+0

그게 쉽지, 롤. –

+2

+1 템플릿 구현. 매우 섹시하다. – chaosTechnician

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

이것은 질문 된 질문에 대한 대답이지만 의도 한 질문은 아닙니다. –

0

사용 '서명되지 않은 짧은 INT'또는 'long int와'

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

그러면 x = 32676; x ++는 32676이 아니라 x == 32677이됩니다. – geoffspear

+1

그렇다면 부호없는 64 비트 정수에서 오버플로를 피하려면 어떻게해야합니까? – Wizard79

관련 문제