在显式转换中使用checked进行溢出检查

当不能使用隐式转换安全的进行转换时(例如将short类型的值转换为byte类型),就必须使用显式转换,例如:

byte var1;
short var2 = 7;
var1 = (byte)var2;

我们知道,short的取值范围比byte大,当将大于255的short类型的值显式转换为byte会出现什么情况呢?

byte var1;
short var2 = 999;
var1 = (byte)var2;

运行结果没有出错,var1的值为231,为什么会是231呢?我们将上边的值转换为二进制看下:

1111100111 : 256
0011100111 : 231
0011111111 : 255

你会发现大于11111111部分全被丢弃了!这样的转换让我们变得没有安全感,这样的转换也变得毫无意义,幸好C#提供了checked关键字让我们在转换的过程中检查是有溢出,一旦溢出程序并会报错System.OverflowException:

byte var1;
short var2 = 999;
var1 = checked((byte)var2);

与checked关键字对应的还有一个关键字unchecked,它表示不进行溢出检查,可见,默认的就是unchecked。

除了使用checked关键字外,我们还可以使用Convert命令来进行显式转换,Convert命令会在转换过程中检测是否有溢出:

byte var1;
short var2 = 999;
var1 = Convert.ToByte(var2);


评论: 0 | 引用: 0 | 查看次数: 3921
发表评论
登录后再发表评论!