【问题标题】:How to check if calculations are within ints higher and lower ranges如何检查计算是否在整数范围内
【发布时间】:2011-09-21 21:46:50
【问题描述】:

我认为这将非常容易,但它导致需要进行比我想要的更多的检查。

到目前为止我有这个代码:

        if (funcType == "Mul")
            return (val1 * val2) <= int.MaxValue && (val1 * val2) >= int.MinValue;

        if (funcType == "Add")
            return (val1 + val2) <= int.MaxValue && (val1 + val2) >= int.MinValue;

        if (funcType == "Sub")
            return (val1 - val2) <= int.MaxValue && (val1 - val2) >= int.MinValue;

        if (funcType == "Div")
            return (val1 / val2) <= int.MaxValue && (val1 / val2) >= int.MinValue;

我需要检查计算结果是否在 int 值类型范围内。

例如

int val1 = 1777777774;
int val2 = 477778777;

当加在一起时,结果是 -2039410745(一个有效的 int) 但这不是正确的答案(可以这么说),因此检查无法按预期工作。

我想我可以将 val1 和 val2 声明为 long,以防止出现负面结果,然后进行比较。

这会安全吗(我仍然担心在做乘法时结果会达到极限),你能想到更好的方法吗?

非常感谢, 可汗。

【问题讨论】:

  • 为什么不使用 Enum 的 funcType 呢?
  • 在我的实现中,funcTypes 是使用正则表达式从字符串中提取出来的。

标签: c# casting int


【解决方案1】:

首先将其中一个参数转换为long,然后整个计算将使用 64 位整数。

只要您的原始参数仍然输入为int,就没有溢出的危险:long.MaxValue 的大小是int.MaxValue * int.MaxValue 的两倍以上,long.MinValueint.MinValue * int.MaxValue 的大小类似。

long longVal1 = (long)val1;

if (funcType == "Mul")
    return (longVal1 * val2) <= int.MaxValue && (longVal1 * val2) >= int.MinValue;

if (funcType == "Add")
    return (longVal1 + val2) <= int.MaxValue && (longVal1 + val2) >= int.MinValue;

if (funcType == "Sub")
    return (longVal1 - val2) <= int.MaxValue && (longVal1 - val2) >= int.MinValue;

if (funcType == "Div")
    return (longVal1 / val2) <= int.MaxValue && (longVal1 / val2) >= int.MinValue;

【讨论】:

    【解决方案2】:

    使用checked 关键字并捕获OverflowException

    【讨论】:

    • 对非异常流控制使用异常通常被认为是不好的做法。
    • 嗯,manji 的回答和我的回答提供了另一种选择。我想由 OP 来决定什么对他们最有效。
    • 酷,不知道检查。试了一下,它奏效了。但是我会接受卢克斯的建议,因为它看起来更干净并且避免捕获异常。
    猜你喜欢
    • 2011-06-29
    • 2011-03-31
    • 1970-01-01
    • 1970-01-01
    • 2015-11-28
    • 2018-08-04
    • 2014-04-08
    • 2011-08-28
    • 2011-06-08
    相关资源
    最近更新 更多