1

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

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应为任意数字。对于我正在测试的示例,它的sbyte值为-13(使用调试器验证)。我可以在调试器中单步执行并到达该行return (byte) d;……此时会抛出一个OverflowException,尽管它在unchecked块中。

所以...什么给了?

此外,如果您正在查看我的实现并想知道我到底在做什么 - 这是我迄今为止尝试过的所有体操的结果,没有得到这个例外。必须简洁的答案获胜:)

注意:异常信息如下:

System.OverflowException:对于无符号字节,值太大或太小。---> System.OverflowException:对于 UInt32,值太大或太小。

4

3 回答 3

3

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

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

于 2014-01-07T21:58:21.780 回答
0

从您的评论中:

基本上只是 reinterpret_cast 它...

我收集到您想将 a 转换为sbyte一个值-13并将其解释为byte.

所以简单地转换它:

sbyte s = -13;
byte u = (byte)s; // u = 243
于 2014-01-07T22:05:41.310 回答
0

该异常是由使用Convert.ChangeType.. 引起的,这就是为什么该unchecked块在各种情况下可能无法正常工作(以及为什么您无疑会发布此问题)。

Convert.ChangeType最终打电话IConvertible.To<TypeHere>。on的ToByte方法System.SByte是这样的:

public static byte ToByte(sbyte value) {
    if (value < 0) {
        throw new OverflowException(Environment.GetResourceString("Overflow_Byte"));
    }

    return (byte)value;
}

它明确抛出异常..因此为什么unchecked没用。

于 2014-01-07T22:03:27.733 回答