1

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

一个简单Convert.ToInt16(65535)的抛出一个异常,即 65535 对于Int16.

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

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

4

7 回答 7

4

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

UInt32 val = 65535;
Int16 result = (Int16)(val - 32768)
于 2013-03-01T08:59:07.187 回答
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;
于 2013-03-01T09:13:00.000 回答
3

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

UInt32  x = 65536;
Int16   y = BitConverter.ToInt16( BitConverter.GetBytes( x ), 0 );
于 2013-03-01T09:03:21.217 回答
1

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

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

相反:

public static uint ConvertToUInt32(this short source)
{
    return (ushort)(source + 32768);
}
于 2013-03-01T08:59:18.187 回答
0

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

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

请注意,如果您的源值不适合您指定的范围,这将溢出。因此,如果您想检查该溢出,您可以将其包装成一个checked表达式(在溢出时引发异常),或用于Math.Min强制执行上限65535

short displayValue = (short)(Math.Min(value, UInt16.MaxValue) + Int16.MinValue);
于 2013-03-01T09:01:04.647 回答
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 -32768UInt32 65535一些代码进行比较,例如

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(']');

你会得到像

[0, 128] // 对于Int16 -32768

[255, 255, 0, 0] // 为UInt32 65535

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

于 2013-03-01T09:57:41.100 回答
-1
UInt32 source = ...

Int16 result = (Int16) (source > 32767 ? source - 65536 : source);
于 2013-03-01T09:00:40.053 回答