使用checked 若运算是常量表达式,则产生编译错误:The operation overflows at complie time in checked mode. 若运算是非常量表达式,则运行时会抛出一个溢出异常:OverFlowException异常 使用unchecked 无论运算是否是常量表达式,都没有编译错误或是运行时异常发生,只是返回值被截掉不符合目标类型的高位。 既未使用checked又未使用unchecked 若运算是常量表达式,默认情况下总是进行溢出检查,同使用checked一样,会无法通过编译。 若运算是非常量表达式,则是否进行溢出检查,取决于外部因素,包括编译器状态、执行环境参数等 如果同时在程序代码中指定 checked或unchecked标志,又有了checked编译器选项,则除了标志为unchecked的代码外,其余的都有checked语义
unchecked 关键字用于取消整型算术运算和转换的溢出检查。 来个例子吧: unchecked { int val = 2147483647 * 2; } 你想想整形是多大啦,这个肯定会超过整型的大小所以就要避免溢出啰 因为上面的计算在 unchecked 块中执行,所以结果对于整数来说太大这一事实被忽略,并且 val 被赋予值 -2。返回的是-2结果(默认的)再来个例子吧: using System;class TestClass { const int x = 2147483647; // Max int const int y = 2; static void Main() { int z; unchecked { z = x * y; } Console.WriteLine("Unchecked output value: {0}", z); } }这个结果你说是多少呢? 对! 结果是:Unchecked output value: -2 因为溢出就输出默认值-2 没有溢出就直接输出啰
若运算是常量表达式,则产生编译错误:The operation overflows at complie time in checked mode.
若运算是非常量表达式,则运行时会抛出一个溢出异常:OverFlowException异常
使用unchecked
无论运算是否是常量表达式,都没有编译错误或是运行时异常发生,只是返回值被截掉不符合目标类型的高位。
既未使用checked又未使用unchecked
若运算是常量表达式,默认情况下总是进行溢出检查,同使用checked一样,会无法通过编译。
若运算是非常量表达式,则是否进行溢出检查,取决于外部因素,包括编译器状态、执行环境参数等
如果同时在程序代码中指定 checked或unchecked标志,又有了checked编译器选项,则除了标志为unchecked的代码外,其余的都有checked语义
unchecked
{
int val = 2147483647 * 2;
}
你想想整形是多大啦,这个肯定会超过整型的大小所以就要避免溢出啰
因为上面的计算在 unchecked 块中执行,所以结果对于整数来说太大这一事实被忽略,并且 val 被赋予值 -2。返回的是-2结果(默认的)再来个例子吧:
using System;class TestClass
{
const int x = 2147483647; // Max int
const int y = 2; static void Main()
{
int z;
unchecked
{
z = x * y;
}
Console.WriteLine("Unchecked output value: {0}", z);
}
}这个结果你说是多少呢?
对! 结果是:Unchecked output value: -2
因为溢出就输出默认值-2 没有溢出就直接输出啰