C# 寻找一个对数字求和而不是溢出的.NET函数,它只返回int.MaxValue

C# 寻找一个对数字求和而不是溢出的.NET函数,它只返回int.MaxValue,c#,.net,math,C#,.net,Math,我使用int.MaxValue作为惩罚,有时我会一起计算惩罚。是否有一个功能,或者您将如何创建一个最优雅、最高效的功能 即 50+100=150 整数最大值+50=整数最大值而非整数最小值+50 int penaltySum(int a, int b) { return (int.MaxValue - a < b) ? int.MaxValue : a + b; } { 返回值(int.MaxValue-a0&&b>0) { 返回值(int.MaxValue-a

我使用int.MaxValue作为惩罚,有时我会一起计算惩罚。是否有一个功能,或者您将如何创建一个最优雅、最高效的功能

50+100=150

整数最大值+50=整数最大值而非整数最小值+50
int penaltySum(int a, int b)
{
    return (int.MaxValue - a < b) ? int.MaxValue : a + b;
}
{ 返回值(int.MaxValue-a 更新:如果您的处罚可能是负面的,这将更合适:

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;
}
intpenaltysum(inta,intb)
{
如果(a>0&&b>0)
{
返回值(int.MaxValue-ab)?int.MinValue:a+b;
}
返回a+b;
}
内部惩罚(内部a、内部b)
{
返回值(int.MaxValue-a
更新:如果您的处罚可能是负面的,这将更合适:

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;
}
intpenaltysum(inta,intb)
{
如果(a>0&&b>0)
{
返回值(int.MaxValue-ab)?int.MinValue:a+b;
}
返回a+b;
}
这个答案

int penaltySum(int a, int b)
{
    return (int.MaxValue - a < b) ? int.MaxValue : a + b;
}
我建议如下实施penaltySum():

private int penaltySum(int x, int y, int max)
{
    long result = (long) x + y;
    return result > max ? max : (int) result;
}
请注意,我传入了max值,但是如果愿意,您可以硬编码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;
}这个答案

int penaltySum(int a, int b)
{
    return (int.MaxValue - a < b) ? int.MaxValue : a + b;
}
我建议如下实施penaltySum():

private int penaltySum(int x, int y, int max)
{
    long result = (long) x + y;
    return result > max ? max : (int) result;
}
请注意,我传入了max值,但是如果愿意,您可以硬编码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(溢出异常)怎么样?

它是否溢出过多,或者这是一种错误情况?使用try/catch(溢出异常)怎么样?

谢谢您指出我的疏忽。我已经更新了我的示例,添加了一个负面处罚选项。至于您的选项,两者都有效,但我仍然认为我提供的方法更优越。您的第一种技术不是通用的,因为它需要提供更大的类型。您的第二种技术使用异常,因此我认为它不符合Tomas指定的“效率”要求。感谢您指出我的疏忽。我已经更新了我的示例,添加了一个负面处罚选项。至于您的选项,两者都有效,但我仍然认为我提供的方法更优越。您的第一种技术不是通用的,因为它需要提供更大的类型。您的第二种技术使用异常,因此我认为它不符合Tomas指定的“效率”要求。