2

このトピックに関する大量の質問から、オーバーフローを検出する方法を知っています。

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

ただし、少なくとも 1 つのオーバーフローが発生したかどうかを検出するだけでなく、実際にオーバーフローの数をカウントする方法はありますか?

編集: 誤解に対処するために、トーンまたはそれ以上のオーバーフローにつながる操作の数だけを数えたいのではなく、特定の操作の結果として発生したオーバーフローの数を数えたいと思います。

4

1 に答える 1

3

これが整数用であると仮定して、すべての演算子をオーバーロードし、静的変数のオーバーフローを合計するInt32のラッパークラスを記述します。これらの演算子でオーバーフロー検出を実行します。最も簡単な(そして最も遅い)のは、checked / try-catchルートを使用することですが、パフォーマンスが必要な場合は、よりスマートな代替手段(つまり、符号の比較)があります。

次に、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.
}
于 2013-02-22T19:09:55.300 に答える