【问题标题】:How to avoid integer overflow?如何避免整数溢出?
【发布时间】:2010-06-14 23:43:14
【问题描述】:

在以下 C++ 代码中,32767 + 1 = -32768。

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

有什么方法可以让“var”保留为 32767,而不会出错?

【问题讨论】:

  • 你知道这里发生了什么吗?您已经达到整数(短)的上限,因此再添加一个会将符号翻转为整数的最大负数。
  • 如果你想要一个不同的模式,整数不会自动环绕,它不存在,抱歉。
  • 这让我想起了我为什么要can't sleep。 :-)
  • 这称为saturation arithmetic。这可能非常不合逻辑,因此请注意。什么是 32767+1-1?

标签: c++ variables integer-overflow


【解决方案1】:

是的,有:

if (var < 32767) var++;

顺便说一句,您不应该对常量进行硬编码,而是使用在&lt;limits&gt; 头文件中定义的numeric_limits&lt;short&gt;::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!

【讨论】:

    【解决方案2】:
    #include <iostream> 
    int main(){ 
    unsigned short var = 32767; 
    var++; 
    std::cout << var; 
    std::cin.get(); 
    } 
    

    【讨论】:

    • 这回答了所提出的问题,但我怀疑不是预期的问题。
    【解决方案3】:

    使用“无符号短整数”或“长整数”

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

    【讨论】:

    • 然后 x = 32676; x++ 将导致 x == 32677,而不是 32676。
    • 好的,那么如何避免无符号 64 位整数的溢出?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-16
    • 1970-01-01
    • 1970-01-01
    • 2010-11-30
    • 1970-01-01
    • 1970-01-01
    • 2017-08-28
    相关资源
    最近更新 更多