一个最有效的做法,以防止算术的溢出和溢
-
09-06-2019 - |
解决方案
一种可能性是使用一种语言,具有任意的中小型整数,从来没有溢/下溢。
否则,如果这是你真的关心,并且如果你的语言允许的话,编写一个包装类行为的喜欢整数,但是检查每一个操作的溢出。你甚至可能有这样做的检查在调试版本,并留下的东西优化用于释放生成。在语言等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...
};
编辑:
原来有人 这样做已经用C++ -当前实施的重点是为Visual Studio,但它看起来像他们得到的支持海湾合作委员会。
其他提示
我写了很多测试码做到的范围的/有效性检查,在我的代码。这往往赶上大多数的这类情况,绝对可以帮助我写更多的防弹的代码。
使用高精度浮点像一个数字 只要双倍.
我认为你是缺少一个非常重要的选项,在你的清单:选择正确的编程语言的工作。有许多编程语言,它不具有这些问题,因为他们没有固定的尺寸整数。
还有更重要的考虑因素当选择哪一种语言的使用比大的整数。简单地检查你的输入,如果你不知道如果价值是在边界、或使用例外处理,如果情况是非常罕见的。
包装用于检查的不一致性将会有意义在许多情况下。如果添加剂的作业(即外或乘)在两个或多个结果的整数在较小值的比操作数然后你知道的东西去了错误的。每添加剂的操作应遵循,
if (sum < operand1 || sum < operand2)
omg_error();
同样,任意操作,从逻辑上说应该结果在一个更小的数值应该检查,看看它是不小心embiggin。
不隶属于 StackOverflow