我希望能够将一个高价值的无符号整数(使用最高位的值)转换为有符号整数.在这种情况下,我不在乎该值高于有符号整数类型的最大值.我只是希望它转换为任何位值表示为有符号整数.换句话说,我希望它会导致一个负数.
然而,使用VB.NET,CType操作不会这样工作(或任何其他转换功能,如CShort和Cnteger).当您尝试转换高于所需签名类型的最大值的无符号值时,会引发OverflowException,而不是返回负数.例如:
Dim x As UShort = UShort.MaxValue Dim y As Short = CShort(x) ' Throws OverflowException
值得一提的是,DirectCast操作不能用于在有符号和无符号类型之间转换值,因为两种类型都不会继承或实现另一种类型.例如:
Dim x As UShort = UShort.MaxValue Dim y As Short = DirectCast(x,Short) ' Won't compile: "Value of type 'UShort' cannot be converted to 'Short'
我已经想出了一种办法来做我想做的事,但似乎不必要的丑陋.这是我如何工作:
Dim x As UShort = UShort.MaxValue Dim y As Short = BitConverter.ToInt16(BitConverter.GetBytes(x),0) ' y gets set to -1
就像我说的那样,这个工作,但是如果在VB.NET中有一个更简单,更干净的方法,我很想知道它是什么.
BitConverter的持续使用将会有一些不便之处,如果你使用了很多 – 特别是对于性能.如果是这样,我会非常想尝试在C#中添加一个可以进行直接转换的实用程序库(通过未经检查,尽管未经检查通常是C#中的默认值),并引用该库.另一种选择可能是滥用“联合”结构;以下应该很容易地转换为VB:
原文链接:https://www.f2er.com/vb/255157.html[StructLayout(LayoutKind.Explicit)] struct EvilUnion { [FieldOffset(0)] public int Int32; [FieldOffset(0)] public uint UInt32; } ... var evil = new EvilUnion(); evil.Int32 = -123; var converted = evil.UInt32;
即
<System.Runtime.InteropServices.StructLayout(Runtime.InteropServices.LayoutKind.Explicit)> Structure EvilUnion <System.Runtime.InteropServices.FieldOffset(0)> Public Int32 As Integer <System.Runtime.InteropServices.FieldOffset(0)> Public UInt32 As UInteger End Structure ... Dim evil As New EvilUnion evil.Int32 = -123 Dim converted = evil.UInt32