2011-10-19 22 views
2

我想知道是否有人可以解释我看到的OverflowException。为什么在发生小数字 - >字节转换时会发生OverflowException,但不会发生uint-> byte?

考虑下面的代码:

 uint fred = 32768; 
     byte wilma = (byte)fred; 
     decimal bamBam = fred; 
     wilma = (byte)bamBam; 

(铸造decimalbyte时)我只在最后一行得到一个OverflowException异常。当在uint中将相同的值转换为byte时,我不明白。

我不明白为什么是这样的情况。有什么建议么?

回答

4

从十进制到字节中的显式转换为documented to throw this exception当小数是字节(0到255)的范围之外。

溢出异常:值小于Byte.MinValue或大于 Byte.MaxValue。

而在第二行中,您应该注意到该值默默包装,wilma为0,因此在该合法转换中存在数据丢失。如果您希望看到与uint-to-byte积分转换相同的上述行为,则可以在检查的上下文中运行。

checked 
{ 
    uint fred = 32768; 
    byte wilma = (byte)fred; 
} 

在未经检查的上下文中,整数类型之间的转换被忽略。丢弃更高阶的位。 (参见:C#语言规范的4.1.5节)

的选中和未选中运算符和语句被用于控制 溢出检查积分型的算术运算和 转换(§7.6.12)。在检查的上下文中,溢出会产生编译时错误或导致引发System.OverflowException。 在未检查的上下文中,忽略溢出并丢弃不适合目标类型的任何高位 。

至于避免这些问题,请使用适合您要存储的数据的类型。如果数据超出范围byte,则使用较大的类型。积分类型和浮点数之间的转换特别有问题,因为后者值的范围可能远远超过整数范围,当然,带小数点的数据丢失是不可避免的。

但是,如果继续使用十进制到字节转换操作,你需要牢记(和比较反对)的最小和字节的最大值。