使用C#,我有几个自定义类,我需要能够检测整数溢出并返回默认的最小值或最大值,具体取决于溢出是否由于结果超过最大值或低于最小值。我似乎无法找到关于如何检测任何地方发生溢出的“类型”的建议。确定是否整数溢出超过或低于边界
这些类分为两种常用类型:使用有符号值的类和使用无符号值的类。
作为一个例子,这里是与Int32值交易的类别之一:
public class Stat32Tf : IStat32T<float>
{
#region fields
private int baseValue, baseAdjustment;
private float baseMultiplier;
#endregion
#region ctors
public Stat32Tf()
{
baseValue = 0;
baseAdjustment = 0;
baseMultiplier = 1f;
}
public Stat32Tf(int baseValue, int baseAdjustment = 0, float baseMultiplier = 1f)
{
this.baseValue = baseValue;
this.baseAdjustment = baseAdjustment;
this.baseMultiplier = baseMultiplier;
}
#endregion
#region properties
public int BaseValue
{
get
{
return baseValue;
}
set
{
baseValue = value;
}
}
public int BaseAdjustment
{
get
{
return baseAdjustment;
}
set
{
baseAdjustment = value;
}
}
public float BaseMultiplier
{
get
{
return BaseMultiplier;
}
set
{
baseMultiplier = value;
}
}
public int TruncValue
{
get
{
return (int)Value;
}
}
public float Value
{
get
{
return (baseValue + baseAdjustment) * baseMultiplier;
}
}
#endregion
}
正如你所看到的,阶级的思想是保持基本值,调整值,和乘数值,并返回Value属性中的聚合值。 (TruncValue属性就像它所暗示的那样,返回截断的整个值,并删除任何小数值)。
目标是处理Value属性的“get”访问器中的溢出,并且如果结果超过了max int值,则返回int.MaxValue,并且如果它低于最小值,则返回int.MinValue,所有这些都没有抛出实际的溢出错误。对我来说很棘手的部分是调整值和乘数也可能是负值(按照设计要求)。
什么是达到此目的的安全方法?我一直没有找到解决这种情况的资源。我猜测需要使用某种算术算法来确定结果是否超出或不足。
如果发生溢出并且结果为肯定,那么溢出正在进行。如果结果为负数,则溢出会超过 – 2013-04-11 12:58:40
@caerolus如果涉及到乘法,它并不是那么容易,结果仍可能具有预期的符号:32位(如果有符号,则为2的补码)的“123456 * 987654 = 1672727936”整数具有环绕溢出行为。 – 2013-04-11 13:01:33
Just FYI,C#中的整数溢出默认情况下不会抛出OverflowException;只有在“检查”环境中。 – 2013-04-11 13:03:05