当int类型 2147483647加上一个int型的1时C#编译器会生成代码,允许计算机悄悄地溢出,结果会是- 2147483648(最大值加上1会溢出最大负数值勤- 2147483648),如果为每个整数表达式溢出检查会赞成性能下降,这时可启用或禁用检查功能,(项目-"yourProject属性"选项-生成卡片(右下角的"高级"按钮,在高级生成设置对话框中,勾选检查运算上溢/下溢选项
不管应用程序如何,都可用checked和uncheckd关键字,选择性打开和关闭程序特定部分溢出检查,这些关键字将会覆盖编译器选项
checked语句
checked块中的任何溢出都有会招聘一个OverflowException异常
int number = Int32.MaxValue;
checked
{
int willThrow = number++;
Console.WriteLine("this won't be reached");
}
也可单独整数表达式int wontThrow = checked(Int32.MaxValue+1)
unchecked语句
int number = Int32.MaxValue;
unckecked
{
int wontThrow = number++;
Console.WriteLine("this will be reached");
}也可单独整数表达式int wontThrow = unchecked(Int32.MaxValue+1)
private int multiplyValues(int leftHandSide, int rightHandSide)
{
expression.Text = leftHandSide.ToString() + " * " + rightHandSide.ToString();
return leftHandSide * rightHandSide;
}
这个代码块会悄悄溢出了int 类型32位限制,会输出一个负值
private int multiplyValues(int leftHandSide, int rightHandSide)
{
expression.Text = leftHandSide.ToString() + " * " + rightHandSide.ToString();
return checked(leftHandSide * rightHandSide);
}
这个代码块会抛出一个OverflowExce
重要提示: 不能使用checked和unchecked关键字来控制浮点(非整数)运算.只能控制整数运算,浮点运算永远不会抛出OverflowException--即使你用0.0来除一个浮点数(.NET Framework有专门表示无穷大的机制)
catch (OverflowException ex)
{
result.Text = ex.Message;
}
在Result文本框上显示"算术运算导致溢出"