c# - 确定整数溢出是否超出或低于界限

标签 c# .net overflowexception

使用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”访问器中的溢出,如果结果超过最大 int 值,则返回 int.MaxValue,如果结果低于最小值,则返回 int.MinValue,所有而不抛出实际的溢出错误。让我感到棘手的部分是调整值和乘数也可能是负值(根据设计要求)。

实现这一目标的安全方法是什么?我无法找到任何解决这种情况的资源。我猜想需要使用某种算术算法来确定结果是高于还是低于。

最佳答案

只有有限的情况会发生下溢:

  • 如果 baseValue 和 baseAdjustment 均为负数 -> 如果 Int.MinValue - baseAdjustment > baseValue 则出现下溢。

  • 如果baseValue + baseAjustment为负且baseMultiplier为正 -> 如果引发溢出异常,则只能是下溢。

  • 如果baseValue + baseAdjustment为正,但baseMultiplier为负 -> 如果引发溢出异常,则只能是下溢。

如果您想避免引发/捕获异常,那么它可能会更复杂一些(您可能希望将结果转换为 long 并将其与 Int.MaxValue 进行比较;这样它只会在以下情况下引发异常:结果超过 Long.MaxValue)。

关于c# - 确定整数溢出是否超出或低于界限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15949297/

相关文章:

c# - 为什么将 int.MinValue 除以 -1 在未经检查的上下文中抛出 OverflowException?

C# - 什么会导致溢出检查?

c# - Silverlight 4 是否需要 SilverlightFaultBehavior 类?

c# - gridview 控件上的自定义分页

c# - 为 ZPL 编写词法分析器解释器需要学习什么?

c# - 空文字参数类型重载解析

c# - 无法添加对已安装 NuGet 包的引用?

c# - 不安装 SMTP 服务器发送邮件

c# - 如果在嵌套集合上使用 SelectMany,则保留父实例