加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-17 00:28:57 所属栏目:大数据 来源:网络整理
导读:我希望能够将一个高价值的无符号整数(使用最高位的值)转换为有符号整数.在这种情况下,我不在乎该值高于有符号整数类型的最大值.我只是希望它转换为任何位值表示为有符号整数.换句话说,我希望它会导致一个负数. 然而,使用VB.NET,CType操作不会这样工作(或任何
我希望能够将一个高价值的无符号整数(使用最高位的值)转换为有符号整数.在这种情况下,我不在乎该值高于有符号整数类型的最大值.我只是希望它转换为任何位值表示为有符号整数.换句话说,我希望它会导致一个负数.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读