我如何将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的转换。感谢您迄今为止的所有回答。
这取决于您到底想要什么。您可以使用:
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
-32768
和UInt32
65535
的byte
布局与之类的代码进行比较
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);