在默认情况下,当溢出发生的时候,系统会自动的对结果进行截断。比如
int n1 = int.MaxValue; // 2147483647 (0x7FFFFFFF)
n1 = n1 + 1; // Now -2147483648 (wrapped) 加1后溢出,被截断
你也可以通过抛出一个异常,而非截断。想要这样做,你需要使用checked 关键字:
int n1 = int.MaxValue; // 2147483647 (0x7FFFFFFF)
n1 = checked(n1 + 1); // 抛出 OverflowException 异常
你也可以使用checked 关键字,将整个语句包含起来:
checked
{
int n1 = int.MaxValue; // 2147483647 (0x7FFFFFFF)
n1 = n1 + 1; // Throws OverflowException
}
你还可以修改你的项目属性,更改发生溢出时的默认行为。进入项目的“属性”面板,选择“生成”页,然后点击“高级”按钮,进入到“高级生成设置”窗口。
将“检查运算上溢\下溢”勾上即可。这样就无需使用checked 关键字。
与之相反的,如果在某些情况下你不想要抛出这些异常,可以使用unchecked 关键字。假设你按照上面介绍的方法设置了项目属性,如果溢出会抛出异常,运行下面的代码:
int n1 = int.MaxValue; // 2147483647 (0x7FFFFFFF)
int n2 = unchecked(n1 + 1); // 使用了unchecked关键字,不会抛出异常,只截断,截断后值为: -2147483648
int n3 = n1 + 1; // 没有使用unchecked关键字,抛出 OverflowException 异常。
我们也可以这样使用unchecked 关键字:
int n1 = int.MaxValue; // 2147483647 (0x7FFFFFFF)
unchecked
{
int n2 = n1 + 1; // 截断,截断后值为: -2147483648
int n4 = n1 * 2; // 截断,截断后值为: -2
}