微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

.net – 如何将无符号整数转换为没有OverflowException的有符号整数

我希望能够将一个高价值的无符号整数(使用最高位的值)转换为有符号整数.在这种情况下,我不在乎该值高于有符号整数类型的最大值.我只是希望它转换为任何位值表示为有符号整数.换句话说,我希望它会导致一个负数.

然而,使用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:
[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

原文地址:https://www.jb51.cc/vb/255157.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐