2

我想知道是否有人可以解释我看到的溢出异常。

考虑以下代码:

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

我只在最后一行得到一个 OverflowException(当将 adecimal转换为 a时byte)。uint在将相同的值转换为 a时,我没有得到它byte

我不明白为什么会这样。有什么建议么?

4

1 回答 1

4

当小数超出字节范围(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,请使用更大的类型。整数类型和浮点数之间的转换尤其成问题,因为后者值的范围可能远远超过整数的范围,当然小数位的数据丢失是不可避免的。

但是,如果您继续使用十进制到字节的转换,则需要记住(并与之比较)字节的最小值和最大值。

于 2011-10-19T22:37:41.483 回答