如何在不引发OverflowException的情况下将无符号整数转换为有符号整数

11
我希望能够将一个高位无符号整数(即使用最高位的值)转换为有符号整数。在这种情况下,我并不在意该值是否高于有符号整数类型的最大值。我只想将其转换为位值表示的有符号整数。换句话说,我希望它能得到一个负数。
然而,在VB.NET中,CType操作不是这样工作的(也包括其他转换函数,如CShort和CInteger)。当您尝试转换一个超过所需有符号类型的最大值的无符号值时,它会抛出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实现方式,我很想知道。


3
在 VB 中,我从未想过这很困难;而在 C# 中,这只需要一个 checked/unchecked 关键字即可解决。 - Marc Gravell
11个回答

-2

不懂VB,但我预计它与C#相似,因为它是.NET代码。 在C#中,您可以简单地使用类型转换:

UInt16 ui = 65000;
Int16   i = (Int16)ui;

完成。


1
不是的。这正是我所问的。在VB中,CTypeDirectCast是类型转换运算符,并且在这种情况下都无法使用。 - Steven Doggart

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接