使用检查数据(int,double,float等)溢出,并抛出异常

在默认情况下,当溢出发生的时候,系统会自动的对结果进行截断。比如

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
}

原文地址:https://csharp.2000things.com/2010/08/14/58-generate-exceptions-on-integer-overflow-using-checked-operator/



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值