如何在C#中将ushort转换为short?

时间:2011-08-10 20:10:11

标签: c# .net

一个版本是

short value = unchecked((short)0x8010);

下面的其他版本将无效,并会抛出异常

short value = Convert.ToInt16(0x8010);
short value = (short)(0x8010);

是否有其他版本没有未经检查的关键字?

已更新:预期为负值-32752

3 个答案:

答案 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));