寻找一个.NET函数来求和,而不是溢出,只会返回int.MaxValue

时间:2020-03-06 14:41:45  来源:igfitidea点击:

我将int.MaxValue用作惩罚,有时我会一起计算惩罚。有没有一种功能,或者我们将如何创建功能最多,效率最高的功能。

IE。

50 + 100 = 150

整数最大值+ 50 =整数最大值而不是整数最小值+ 50

解决方案

int penaltySum(int a, int b)
{
    return (int.MaxValue - a < b) ? int.MaxValue : a + b;
}

更新:如果处罚可能是负面的,这会更合适:

int penaltySum(int a, int b)
{
    if (a > 0 && b > 0)
    {
        return (int.MaxValue - a < b) ? int.MaxValue : a + b;
    }

    if (a < 0 && b < 0)
    {
        return (int.MinValue - a > b) ? int.MinValue : a + b;
    }

    return a + b;
}

这个答案...

int penaltySum(int a, int b)
{
    return (int.MaxValue - a < b) ? int.MaxValue : a + b;
}

未通过以下测试:

[TestMethod]
public void PenaltySumTest()
{
    int x = -200000; 
    int y = 200000; 
    int z = 0;

    Assert.AreEqual(z, penaltySum(x, y));
}

我建议按以下方式实现刑罚Sum():

private int penaltySum(int x, int y, int max)
{
    long result = (long) x + y;
    return result > max ? max : (int) result;
}

请注意,我传入的是最大值,但是我们可以根据需要在int.MaxValue中进行硬编码。

或者,我们可以强制执行算术运算溢出检查并执行以下操作:

private int penaltySum(int x, int y, int max)
{
   int result = int.MaxValue;

   checked
   {
       try
       {
           result = x + y;
       }
       catch
       {
           // Arithmetic operation resulted in an overflow.
       }
   }

   return result;

}

它溢出很多还是错误状态?如何使用try / catch(溢出异常)?