我如何将0-65535转换为Int16等效值-32768-32767

本文关键字:Int16 -32768-32767 转换 0-65535 | 更新日期: 2023-09-27 18:01:37

我确信这是一个非常简单的答案,但我无法理解。我收到了一个UInt32格式的值,尽管它的最大值是65535。出于演示目的,需要将其转换为Int16格式,因此显示的范围为-32768到32767。

一个简单的Convert.ToInt16(65535)抛出一个异常,即65535对于Int16来说要么太大要么太小。

有没有内置的功能来处理这个问题,或者有人能给我一个解决方案吗?

编辑:在进一步讨论后再次编辑-65535不是范围移位的,事实上是-32768,所以我想做从UInt32 65535到Int16-32768的转换。感谢您迄今为止的所有回答。

我如何将0-65535转换为Int16等效值-32768-32767

这取决于您到底想要什么。您可以使用:

int i = 65535;
Int16 x = (Int16) i;

这将65535映射到-1,65534映射到-2,等等

但如果你想将你的范围从0-65535转移到-32768-+32767,那么你可以使用

int yourvalue = 65535; // value between 0...65535
int i = yourvalue - 32768;
Int16 x = (Int16 ) i;

也许我错过了什么,但你能不能不做这样的事情?

UInt32 val = 65535;
Int16 result = (Int16)(val - 32768)

假设您想将位重新解释为int16(即65535->-1(

UInt32  x = 65536;
Int16   y = BitConverter.ToInt16( BitConverter.GetBytes( x ), 0 );

没有任何内置内容,因此您需要编写自己的内容。这里有一个扩展方法:

public static short ConvertToInt16(this uint source)
{
    return (short)(source - 32768);
}

相反:

public static uint ConvertToUInt32(this short source)
{
    return (ushort)(source + 32768);
}

如果你不想在代码中使用太多的幻数,你可以通过添加Int16.MinValue:来改变范围

short displayValue = (short)(value + Int16.MinValue);

请注意,如果源值不符合您指定的范围,则会溢出。因此,如果您想检查溢出,可以将其封装到checked表达式中(在溢出时抛出异常(,或者使用Math.Min来强制执行65535:的上限

short displayValue = (short)(Math.Min(value, UInt16.MaxValue) + Int16.MinValue);

编辑后,我想你是在要求之类的东西

static Int16 Convertor(UInt32 val)
{
    if (val > Int16.MaxValue)
    {
        var h = (val - Int16.MaxValue) * -1;
        if (h < Int16.MinValue)
        {
            throw new OverflowException();
        }
        return (Int16)h;
    }
    return (Int16)val;
}

如果将Int16 -32768UInt32 65535byte布局与之类的代码进行比较

var b = BitConvertor.GetBytes(val);
Console.Write('[')
for (var i = 0; i < b.Length - 1; i++)
{
    Console.Write(b[i]);
    Console.Write(", ");
}
Console.Write(b[b.Length - 1]);
Console.WriteLine(']');

你会得到像一样的输出

[0128]//对于Int16 -32768

[255255,0,0]//对于UInt32 65535

我看不到任何简单的字节转换可以得到你想要的结果。

UInt32 source = ...
Int16 result = (Int16) (source > 32767 ? source - 65536 : source);