我确定这是一个非常简单的答案,但我无法弄清楚。
我已经看到了UInt32
格式的值,尽管它的最大值为65535。
为了演示目的,需要将其转换为Int16
格式,因此显示的范围是-32768到32767.
一个简单的Convert.ToInt16(65535)
抛出一个异常,即65535对于Int16
来说太大或太小。
是否有内置功能来处理这个问题,或者有人能指出我的解决方案吗?
编辑:在进一步讨论之后再次编辑 - 65535不是范围转移它实际上是-32768,所以我想要从UInt32 65535转换到Int16 -32768。 到目前为止,感谢您的所有答案。
答案 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);