2008-09-17 21 views

回答

3

一种可能性是使用任意si不会溢出/下溢的整数。否则,如果这是你真正关心的事情,并且如果你的语言允许,写一个类似于整数的包装类,但检查每个操作是否溢出。你甚至可以让它对调试版本进行检查,并且对发布版本进行优化。在像C++这样的语言中,你可以这样做,它的行为几乎和发布版本的整数类似,但对于调试版本,你可以得到完整的运行时检查。

class CheckedInt 
{ 
private: 
    int Value; 

public: 
    // Constructor 
    CheckedInt(int src) : Value(src) {} 

    // Conversions back to int 
    operator int&() { return Value; } 
    operator const int &() const { return Value; } 

    // Operators 
    CheckedInt operator+(CheckedInt rhs) const 
    { 
     if (rhs.Value < 0 && rhs.Value + Value > Value) 
      throw OverflowException(); 
     if (rhs.Value > 0 && rhs.Value + Value < Value) 
      throw OverflowException(); 
     return CheckedInt(rhs.Value + Value); 
    } 

    // Lots more operators... 
}; 

编辑:

原来有人doing this already for C++ - 目前实施的重点是为Visual Studio,但看起来他们得到了海湾合作委员会的支持。

1

我写了很多测试代码来对我的代码进行范围/有效性检查。这往往能够捕捉到这些类型的情况 - 这绝对有助于我编写更多防弹代码。

1

使用高精度浮点数,如long double

+0

浮点(具有任何精度)引入了更难的一类问题,即精度损失。即`(x + 1.0)-x!= 1`。使用'长双'只会降低频率和幅度。 – MSalters 2009-09-14 10:19:07

1

我认为您在列表中缺少一个非常重要的选项:为作业选择正确的编程语言。有许多编程语言没有这些问题,因为它们没有固定大小的整数。

0

当选择使用哪种语言而不是整数大小时,还有更重要的考虑因素。如果您不知道该值是否在界限内,则只需检查输入;如果情况非常罕见,则使用异常处理。

0

检查不一致性的包装在许多情况下都有意义。如果对两个或多个整数的加法操作(即加法或乘法)导致的值小于操作数,那么你就知道出了问题。每一个加法运算应遵循,

if (sum < operand1 || sum < operand2) 
    omg_error(); 

同样应该在逻辑上导致较小的值,应检查,看它是否被意外embiggin'd任何操作。

0

你是否研究过使用形式化方法来检查代码以证明它没有溢出?一种称为抽象解释的形式化方法技术可以检查软件的健壮性,以证明软件不会遭受溢出,下溢,除以零,溢出或其他类似的运行时错误。这是一种彻底分析您的软件的数学技术。该技术由Patrick Cousot在20世纪70年代首创。它成功用于诊断阿里安5号火箭的溢流状况,溢流造成运载火箭的毁灭。溢出是在将浮点数转换为整数时引起的。你可以找到更多关于这项技术的信息here以及Wikipedia