首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么这会抛出一个OverflowException?

为什么这会抛出一个OverflowException?
EN

Stack Overflow用户
提问于 2014-01-07 21:53:40
回答 3查看 7.3K关注 0票数 1

我在方法中有以下代码来将任何数字转换为字节:

代码语言:javascript
复制
try {
    return (byte) Convert.ChangeType(operand.RealValue, TypeCode.Byte);
}
catch (OverflowException) {
    if (AllowArithmeticOverflow) {
        unchecked {
            decimal d = Convert.ToDecimal(operand.RealValue);
            return (byte) d;
        }
    }

    throw;
}

在这段代码中,operand.RealValue应该是任意数字。对于我正在测试的示例,它是一个值为-13的sbyte (用调试器验证)。我可以进入调试器并进入行return (byte) d; .此时抛出一个OverflowException,尽管它位于unchecked块中。

所以..。怎么回事?

另外,如果你在看我的实现,想知道我到底在做什么--这是我一直努力不想得到这个例外的所有体操的结果。一定要简洁回答赢:)

注意:异常消息如下:

System.OverflowException:对于一个没有符号的字节,值要么太大要么太小。-> System.OverflowException:对于UInt32来说,值要么太大要么太小。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-01-07 21:58:21

显然,没有办法将-13解释为一个字节。除非您指定了额外的上下文,否则至少不会。也许您的意思是将-13视为无符号字符(值介于-128和127之间),然后将位重新解释为有符号字符(字节)。

如果这是您要做的,那么您可以使用BitConverter类。

票数 3
EN

Stack Overflow用户

发布于 2014-01-07 22:03:27

异常是由使用Convert.ChangeType..。这就是为什么unchecked块可能无法在各种情况下工作(以及为什么您无疑要发布这个问题)。

Convert.ChangeType最后打电话给IConvertible.To<TypeHere>ToByte方法在System.SByte上如下所示:

代码语言:javascript
复制
public static byte ToByte(sbyte value) {
    if (value < 0) {
        throw new OverflowException(Environment.GetResourceString("Overflow_Byte"));
    }

    return (byte)value;
}

它显式地抛出了异常。因此,为什么unchecked是无用的。

票数 0
EN

Stack Overflow用户

发布于 2014-01-07 22:05:41

从你的评论:

基本上只是reinterpret_cast它..。

据我所知,您希望转换具有值sbyte-13,并将其解释为byte

所以简单地说吧:

代码语言:javascript
复制
sbyte s = -13;
byte u = (byte)s; // u = 243
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20982729

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档