处理整数溢出是一项常见任务,但在C#中处理它的最佳方法是什么?是否有一些语法糖比其他语言更简单?或者这真的是最好的方式吗?
int x = foo();
int test = x * common;
if(test / common != x)
Console.WriteLine("oh noes!");
else
Console.WriteLine("safe!");
答案 0 :(得分:100)
我不需要经常使用此功能,但您可以使用checked关键字:
int x = foo();
int test = checked(x * common);
如果溢出,将导致运行时异常。来自MSDN:
在已检查的上下文中,如果表达式生成的值为 在目的地类型范围之外,结果取决于 表达式是常数还是非常数。不变 表达式导致编译时错误,而非常量表达式 在运行时进行评估并引发异常。
我还应该指出,还有另一个C#关键字unchecked
,它当然与checked
相反,并忽略了溢出。您可能想知道何时使用unchecked
,因为它似乎是默认行为。好吧,有一个C#编译器选项,用于定义如何处理checked
和unchecked
之外的表达式:/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;
}