我希望能够将一个高位无符号整数(即使用最高位的值)转换为有符号整数。在这种情况下,我并不在意该值是否高于有符号整数类型的最大值。我只想将其转换为位值表示的有符号整数。换句话说,我希望它能得到一个负数。
然而,在VB.NET中,CType操作不是这样工作的(也包括其他转换函数,如CShort和CInteger)。当您尝试转换一个超过所需有符号类型的最大值的无符号值时,它会抛出OverflowException异常,而不是返回一个负数。例如:
值得一提的是,
我已经找到了一种实现自己想要的功能的方法,但它看起来有点冗长。这是我的解决方案:
然而,在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实现方式,我很想知道。
checked
/unchecked
关键字即可解决。 - Marc Gravell