在C#中处理整数溢出的最佳方法是什么?

时间:2010-06-02 04:13:03

标签: c# .net integer overflow

处理整数溢出是一项常见任务,但在C#中处理它的最佳方法是什么?是否有一些语法糖比其他语言更简单?或者这真的是最好的方式吗?

int x = foo();
int test = x * common;
if(test / common != x)
    Console.WriteLine("oh noes!");
else
    Console.WriteLine("safe!");

6 个答案:

答案 0 :(得分:100)

我不需要经常使用此功能,但您可以使用checked关键字:

int x = foo();
int test = checked(x * common);

如果溢出,将导致运行时异常。来自MSDN:

  

在已检查的上下文中,如果表达式生成的值为   在目的地类型范围之外,结果取决于   表达式是常数还是非常数。不变   表达式导致编译时错误,而非常量表达式   在运行时进行评估并引发异常。

我还应该指出,还有另一个C#关键字unchecked,它当然与checked相反,并忽略了溢出。您可能想知道何时使用unchecked,因为它似乎是默认行为。好吧,有一个C#编译器选项,用于定义如何处理checkedunchecked之外的表达式:/checked。您可以在项目的高级构建设置下进行设置。

如果你需要检查很多表达式,最简单的做法是设置/checked构建选项。然后,除非包含在unchecked中,否则任何溢出的表达式都将导致运行时异常。

答案 1 :(得分:18)

尝试以下

int x = foo();
try {
  int test = checked (x * common);
  Console.WriteLine("safe!");
} catch (OverflowException) {
  Console.WriteLine("oh noes!");
}

答案 2 :(得分:7)

最佳方式是Micheal Said - 使用Checked关键字。 这可以这样做:

int x = int.MaxValue;
try   
{
    checked
    {
        int test = x * 2;
        Console.WriteLine("No Overflow!");
    }
}
catch (OverflowException ex)
{
   Console.WriteLine("Overflow Exception caught as: " + ex.ToString());
}

答案 3 :(得分:4)

有时,最简单方式是最佳方式。我不能想出一个更好的方式来写你写的东西,但你可以把它缩短为:

int x = foo();

if ((x * common) / common != x)
    Console.WriteLine("oh noes!");
else
    Console.WriteLine("safe!");

请注意,我没有删除x变量,因为调用foo()三次是愚蠢的。

答案 4 :(得分:1)

旧线程,但我刚碰到这个。我不想使用例外。我最终得到的是:

long a = (long)b * (long)c;
if(a>int.MaxValue || a<int.MinValue)
    do whatever you want with the overflow
return((int)a);

答案 5 :(得分:0)

所以,事实之后我遇到了这个问题,它主要回答了我的问题,但对于我的特殊情况(如果其他人有相同的要求),我想要任何会溢出正面值的东西int只是在int.MaxValue定居:

int x = int.MaxValue - 3;
int someval = foo();

try
{
   x += someval;
}

catch (OverflowException)
{
   x = int.MaxValue;
}