一个版本是
short value = unchecked((short)0x8010);
下面的其他版本将无效,并会抛出异常
short value = Convert.ToInt16(0x8010);
short value = (short)(0x8010);
是否有其他版本没有未经检查的关键字?
已更新:预期为负值-32752
答案 0 :(得分:7)
您期望value
是什么?
0x8010 = 32784
短路的范围是-32768到32767,因此值32784不能用短路来表示。存储为0x8010的短消息将被解释为负数。这是你想要的负数吗?
根据另一个问题C#, hexadecimal notation and signed integers,如果您希望将其解释为负数,则必须在C#中使用unsafe
关键字。
答案 1 :(得分:5)
以下内容可用于转换符合ushort
的所有short
值,并替换所有不符合short.MaxValue
的值。这虽然是有损转换。
ushort source = ...;
short value = source > (ushort)short.MaxValue
? short.MaxValue
: (short)source;
如果您正在寻找直接位转换,您可以执行以下操作(但我不建议这样做)
[StructLayout(LayoutKind.Explicit)]
struct EvilConverter
{
[FieldOffset(0)] short ShortValue;
[FieldOffset(0)] ushort UShortValue;
public static short Convert(ushort source)
{
var converter = new EvilConverter();
converter.UShortValue = source;
return converter.ShortValue;
}
}
答案 2 :(得分:0)
我建议:
ushort input;
short output;
output = short.Parse(input.ToString("X"), NumberStyles.HexNumber));