5.2.2 溢出检查
当一种整型转换到另一种整型,这个过程取决于溢出检查上下文。checked关键字用于对整型算术运算和转换显式启用溢出检查,而unchecked关键字则用于取消整型算术运算和转换的溢出检查。
❑启用溢出检查
操作数的值在目标类型的取值范围内,则转换成功,否则将抛出一个System.OverflowException异常,如代码清单5-7所示。
代码清单5-7 使用checked上下文
1 using System;
2
3 namespace ProgrammingCSharp4
4{
5 class TypeConvert
6{
7 static void Main(string[]args)
8{
9 TypeConvert typeConvert=new TypeConvert();
10 typeConvert.DoSomething();
11}
12
13 public void DoSomething()
14{
15//MyInt的值为2147483647.
16 try
17{
18 int MyInt=int.MaxValue;
19 byte MyByte=checked((byte)MyInt);
20}
21 catch(OverflowException)
22{
23 throw;
24}
25}
26}
27}
在上述代码中,第18行中的int型变量MyInt的值为2 147 483 647,在第19行将MyInt强制转换为byte类型后,由于byte型的取值范围为0~255,因为这里使用了checked关键字启用了溢出检查,因此这里因为byte型无法容纳远大于其容量的数值而抛出System.OverflowException异常。
❑取消溢出检查
由于在转换过程将不检查数据是否超过目标类型的取值范围,意味着类型转换永远都会成功。如果源类型的取值范围大于目标类型,那么超过的部分将被截掉;如果源类型的取值范围小于目标类型,那么转换后将使用符号或者零填充至与目标类型的大小相等;如果等于则直接转换至目标类型,如代码清单5-8所示。
代码清单5-8 使用unchecked上下文
1 using System;
2
3 namespace ProgrammingCSharp4
4{
5 class TypeConvert
6{
7 static void Main(string[]args)
8{
9 TypeConvert typeConvert=new TypeConvert();
10 typeConvert.DoSomething();
11}
12
13 public void DoSomething()
14{
15//MyInt的值为2147483647.
16 try
17{
18 int MyInt=int.MaxValue;
19 byte MyByte=(byte)MyInt;
20}
21 catch(OverflowException)
22{
23 throw;
24}
25}
26}
27}
第19行并没有启用溢出检查,因此并没有抛出System.OverflowException异常,但转换的值也是有问题的。限于byte类型的取值范围,这里赋值后MyByte的值将为255,与原始值可以说大相径庭。第19行还可以使用unchecked关键字改写:
byte MyByte=unchecked((byte)MyInt);