使用/checked+编译器开关,CLR会检查算术溢出。发生溢出会抛出OverflowException。
可以在代码特定区域进行溢出检查或不进行溢出检查。
UInt32 a = unchecked((UInt32) (-1));
UInt32 b = checked((UInt32) (-1));
也可以定义checked或unchecked语句块
checked
{
…
}
unchecked
{
…
}
checked或unchecked只决定生成的IL指令,在checked操作符或语录块中调用方法,不会对该方法产生任何影响。
System.Decimal不是CLR基元类型,checked或unchecked对其无效,当运算溢出时总会抛出OverflowException异常。
System.Numberics.BigInteger表示任意大整数,永远不会抛出OverflowException异常,但可能因内存不足抛出OutOfMemoryException异常。