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

时间:2013-03-01 08:56:08

标签: c#

我确定这是一个非常简单的答案,但我无法弄清楚。 我已经看到了UInt32格式的值,尽管它的最大值为65535。 为了演示目的,需要将其转换为Int16格式,因此显示的范围是-32768到32767.

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

是否有内置功能来处理这个问题,或者有人能指出我的解决方案吗?

编辑:在进一步讨论之后再次编辑 - 65535不是范围转移它实际上是-32768,所以我想要从UInt32 65535转换到Int16 -32768。 到目前为止,感谢您的所有答案。

7 个答案:

答案 0 :(得分:4)

也许我错过了一些东西,但你能不能做到这样的事情吗?

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

答案 1 :(得分:4)

这取决于你究竟想要什么。您可以使用:

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;

答案 2 :(得分:3)

假设您要将这些位重新解释为int16(即65535 - > -1)

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

答案 3 :(得分:1)

内置任何东西,所以你需要自己编写。这是一个扩展方法:

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

恰恰相反:

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

答案 4 :(得分:0)

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

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

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

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

答案 5 :(得分:0)

在你编辑之后,我认为你要求的是像

这样的东西
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;
}

如果您将byte Int16-32768 UInt32的{​​{1}}版面与一些代码(如

)进行比较
65535

您将获得类似

的输出
  

[0,128] // 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(']'); Int16

     

[255,255,0,0] //适用于-32768 UInt32

我没有看到任何简单的字节转换来提供你想要的结果。

答案 6 :(得分:-1)

UInt32 source = ...

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