在进行数值类型之间的强制转换时,可能会丢失信息。比如将 int 类型转换为 short 类型时,如果 int 类型会的值大于 short 类型所能存储的最大值,那么就会发生溢出。
1、使用checked检查溢出
通常情况下,发生溢出时并不会自动抛出异常。这时我们就需要使用 checked 来检查溢出,当发生溢出时抛出异常。
1.1、未使用checked的情况
int a = 12345677;
short s = (short)a;
Console.WriteLine(s);
//输出:24909
这里发生了溢出,导致 s 的值发生了错误。但程序仍然可以正常执行,并没有抛出任何异常。
1.2、使用ckecked检查溢出
使用checked检查溢出并将其放在try语句块中来捕获异常。
try
{
CheckeckedMethod();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
void CheckeckedMethod()
{
checked
{
int a = 12345677;
short s = (short)a;
Console.WriteLine(s);
}
}
//输出:Arithmetic operation resulted in an overflow.
2、使用unchecked语句禁用溢出检查
有时我们需要禁用溢出检查,就需要用到unchecked语句。
我们修改一下前面的代码,在 checked 语句块中加入了 unchecked 来禁止检查溢出。这时程序可以正常执行,但可以看出 s1 的值并不正确。
try
{
CheckeckedMethod();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
void CheckeckedMethod()
{
checked
{
int a = 123;
short s = (short)a;
unchecked
{
int num = 1234563;
short s1 = (short)num;
Console.WriteLine("s1: {0}", s1);
}
Console.WriteLine("s: {0}", s);
}
}
//输出:
// s1: -10621
// s: 123
文章亦发表在个人网站,欢迎访问收藏:
BitsOf
C#使用checked检查溢出