我在方法中有以下代码来将任何数字转换为字节:
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来说,值要么太大要么太小。
发布于 2014-01-07 21:58:21
显然,没有办法将-13解释为一个字节。除非您指定了额外的上下文,否则至少不会。也许您的意思是将-13视为无符号字符(值介于-128和127之间),然后将位重新解释为有符号字符(字节)。
如果这是您要做的,那么您可以使用BitConverter类。
发布于 2014-01-07 22:03:27
异常是由使用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是无用的。
发布于 2014-01-07 22:05:41
从你的评论:
基本上只是reinterpret_cast它..。
据我所知,您希望转换具有值sbyte的-13,并将其解释为byte。
所以简单地说吧:
sbyte s = -13;
byte u = (byte)s; // u = 243https://stackoverflow.com/questions/20982729
复制相似问题