Как избежать целочисленного переполнения?
-
27-09-2019 - |
Вопрос
В следующем 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();
}
Используйте «unsigned Colled int» или «длинный int»
#include <iostream>
int main(){
long int var = 32767;
var++;
std::cout << var;
std::cin.get();
}
Не связан с StackOverflow