C# 寻找一个对数字求和而不是溢出的.NET函数,它只返回int.MaxValue
我使用int.MaxValue作为惩罚,有时我会一起计算惩罚。是否有一个功能,或者您将如何创建一个最优雅、最高效的功能 即 50+100=150 整数最大值+50=整数最大值而非整数最小值+50C# 寻找一个对数字求和而不是溢出的.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 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指定的“效率”要求。