高値の符号なし整数 (最上位ビットを使用する値) を符号付き整数に変換できるようにしたいと考えています。この場合、値が符号付き整数型の最大値より大きくても構いません。ビット値が符号付き整数として表すものに変換したいだけです。つまり、負の数になることが予想されます。
ただし、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'
私は自分がやりたいことをする1つの方法を見つけましたが、それは不必要に醜いようです. これが私がそれを機能させる方法です:
Dim x As UShort = UShort.MaxValue
Dim y As Short = BitConverter.ToInt16(BitConverter.GetBytes(x), 0) ' y gets set to -1
私が言ったように、それは機能しますが、VB.NET でそれを行うためのより簡単でクリーンな方法があれば、それが何であるかを知りたいです。