我在一个方法中有以下代码将任何数字转换为一个字节:
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而言大或小。
答案 0 :(得分:3)
显然,没有办法将-13
解释为一个字节。至少除非你指定一些额外的上下文。也许你的意思是将-13
视为无符号字符(-128和127之间的值),然后将这些位重新解释为有符号字符(字节)。
如果您正在尝试这样做,那么您可以使用BitConverter类。
答案 1 :(得分:0)
使用Convert.ChangeType
引起异常..这就是为什么unchecked
块可能无法在各种情况下工作的原因(以及为什么您无疑发布此问题)。
Convert.ChangeType
最终致电IConvertible.To<TypeHere>
。 ToByte
上的System.SByte
方法是这样的:
public static byte ToByte(sbyte value) {
if (value < 0) {
throw new OverflowException(Environment.GetResourceString("Overflow_Byte"));
}
return (byte)value;
}
它明确地抛出异常..因此unchecked
为什么没用。
答案 2 :(得分:0)
来自你的评论:
基本上只是重新解释它...
我认为您希望将sbyte
转换为值-13
并将其解释为byte
。
所以简单地施展它:
sbyte s = -13;
byte u = (byte)s; // u = 243