C#值溢出限制

时间:2011-11-07 23:01:33

标签: c# overflow

我需要限制溢出值。 我按如下方式实现了这个:

    public static sbyte LimitValueToSByte(this int val)
    {
        if (val > sbyte.MaxValue) return sbyte.MaxValue;
        if (val < sbyte.MinValue) return sbyte.MinValue;
        return (sbyte)val;
    }

有更优雅的方式吗?

这是时间关键系统中的代码,因此性能非常重要。

4 个答案:

答案 0 :(得分:3)

这似乎是一个完全可读且有效的代码,无需任何改进。它只是方法的名称。也许使用ToSbyte而不是LimitValueToSByte

答案 1 :(得分:1)

想不出更好的方法来编写这个功能。

我称之为ClampToSByte,因为这种限制操作通常称为ClampLimit稍微不那么具体,并允许其他边界条件,例如环绕。

如果为浮点数实现类似的代码,则应该小心。特别是,您需要确定NaN和签名零所需的行为。但幸运的是,积分值没有问题。

答案 2 :(得分:0)

对我来说很好看。如果你想要更优雅的东西,通用钳位功能如何?

public static T Clamp<T>(this T value, T min, T max)
    where T : IComparable<T>
{
    if (value.CompareTo(min) <= 0) return min;
    if (value.CompareTo(max) >= 0) return max;
    return value;
}

(警告:我没有测试过。)你可以这样使用它:

int a = 42;
sbyte b = (sbyte)a.Clamp(sbyte.MinValue, sbyte.MaxValue);

答案 3 :(得分:0)

我对此问题的新解决方案:

public static sbyte Clamp(this int val)
{
    return (sbyte)Math.Max(Math.Min(value, sbyte.MaxValue), sbyte.MinValue);
}