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);