다음 C++ 코드에서 32767 + 1 = -32768입니다.정수 오버 플로우를 방지하는 방법은 무엇입니까?
#include <iostream>
int main(){
short var = 32767;
var++;
std::cout << var;
std::cin.get();
}
오류없이 "var"를 32767로 남겨 둘 수있는 방법이 있습니까?
다음 C++ 코드에서 32767 + 1 = -32768입니다.정수 오버 플로우를 방지하는 방법은 무엇입니까?
#include <iostream>
int main(){
short var = 32767;
var++;
std::cout << var;
std::cin.get();
}
오류없이 "var"를 32767로 남겨 둘 수있는 방법이 있습니까?
예,이 : 그런데
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!
#include <iostream>
int main(){
unsigned short var = 32767;
var++;
std::cout << var;
std::cin.get();
}
이것은 질문 된 질문에 대한 대답이지만 의도 한 질문은 아닙니다. –
사용 '서명되지 않은 짧은 INT'또는 'long int와'
을#include <iostream>
int main(){
long int var = 32767;
var++;
std::cout << var;
std::cin.get();
}
그러면 x = 32676; x ++는 32676이 아니라 x == 32677이됩니다. – geoffspear
그렇다면 부호없는 64 비트 정수에서 오버플로를 피하려면 어떻게해야합니까? – Wizard79
여기서 무슨 일이 일어나나요? 정수 (짧은 값)에 대해 천장에 도달 했으므로 하나를 더 추가하면 부호를 정수에 대한 최대 음수 값으로 넘깁니다. – blu
정수가 자동으로 감싸지 않는 다른 모드를 원하면 존재하지 않습니다. 죄송합니다. – dmazzoni
이것은 내가 왜 [잠들 수 없다]는 것을 상기시켜줍니다 (http://xkcd.com/571/). :-) –