如何在c#中将usshort转换为short ?

本文关键字:转换 short usshort 中将 | 更新日期: 2023-09-27 18:05:03

一个版本是

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

像下面这样的其他版本将不能工作,并且会抛出异常

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

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

已更新:期望是-32752的负值

如何在c#中将usshort转换为short ?

你期望value是什么?

0x8010 = 32784

短值的取值范围是-32768 ~ 32767,所以32784不能用短值表示。存储为0x8010的短值将被解释为一个负数。是你想要的那个负数吗?

根据c#的另一个SO问题,十六进制表示法和有符号整数,unsafe关键字必须在c#中使用,如果你想要它被解释为一个负数。

下面将工作转换所有适合shortushort值,并替换所有不适合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;
    }
}

我建议:

ushort input;
short output;
output = short.Parse(input.ToString("X"), NumberStyles.HexNumber));