计算操作中的溢出数

时间:2013-02-22 19:02:48

标签: c# checked

关于这个主题的大量问题,我知道如何检测溢出:

try {
    checked(doSomething());
} catch(OverflowException e) {
    //Handle overflow
}

但是,有没有办法不仅检测是否至少有一次溢出,而是实际计算有多少溢出?

编辑:为了解决误解,我不想只计算有多少操作导致音调或更多溢出,但某个操作导致了多少溢出

1 个答案:

答案 0 :(得分:3)

假设这是针对整数的,请为Int32编写一个包装类,在该类中重载所有运算符并将静态变量中的溢出相加。在这些操作符中执行溢出检测,最简单(也是最慢)是检查/尝试捕获路由,但如果需要性能,则有更聪明的替代方法(即比较符号)。

然后在任何地方用你的包装类替换int。

基本代码结构:

struct CheckedInt {
     static int s_numOverflows = 0;
     int m_value;

     public CheckedInt(int value) { m_value = value; }
     public static CheckedInt operator +(CheckedInt x, CheckedInt y) {
         try { 
             return new CheckedInt(checked(x.m_value + y.m_value)); 
         }
         catch(OverflowException) { 
             ++s_numOverflows; 
             return new CheckedInt(unchecked(x.m_value + y.m_value)); 
         }
     }
     // ... etc for all operators, you'll also need to implement casts, IComparable(T), IEquatable(T), etc.
}