如何避免整数溢出?

9
在下面的C++代码中,32767 + 1 = -32768。
#include <iostream>
int main(){
short var = 32767;
var++;
std::cout << var;
std::cin.get();
}

有没有办法仅将“var”保留为32767,而不出现错误?

你明白这里发生了什么吗?你已经达到了整数(short)的上限,所以再加一会将符号翻转为整数的最大负数。 - blu
如果您想要一种不会自动循环的整数模式,很抱歉,这是不存在的。 - dmazzoni
6
这让我想起了为什么我睡不着觉。 :-) - James McNellis
2
这被称为饱和算术。它可能非常不合逻辑,所以请注意。32767+1-1等于多少? - MSalters
3个回答

31

是的,有:

if (var < 32767) var++;

顺便说一下,您不应该硬编码常量,而是应该使用定义在<limits>头文件中的numeric_limits<short>::max()

您可以将这个功能封装在一个函数模板中:

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
#include <iostream> 
int main(){ 
unsigned short var = 32767; 
var++; 
std::cout << var; 
std::cin.get(); 
} 

1
这回答了被问的问题,但我怀疑并不是提问者本意想要知道的问题。 - i_am_jorf

-1

使用 'unsigned short int' 或 'long int'

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

然后 x = 32676; x++ 将导致 x == 32677,而不是 32676。 - Wooble
2
好的,那么如何避免无符号64位整数的溢出呢? - lornova

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接