Jak przekonwertować liczbę całkowitą bez znaku na liczbę całkowitą podpisaną bez wyjątku OverflowException

Chciałbym być w stanie przekonwertować wartość niepodpisaną liczbę całkowitą bez znaku (wartość, która używa bitu najwyższego rzędu) na liczbę całkowitą ze znakiem. W tym przypadku nie obchodzi mnie, że wartość jest wyższa niż maksymalna wartość podpisanego typu całkowitego. Chcę po prostu przekonwertować to, co reprezentują wartości bitowe jako liczba całkowita ze znakiem. Innymi słowy, spodziewam się, że spowoduje to ujemną liczbę.

Jednak z VB.NET,CType operacja nie działa w ten sposób (lub dowolna inna funkcja konwersji jakCShort iCInteger). Podczas próby przekonwertowania wartości niepodpisanej, która jest wyższa niż maksymalna wartość żądanego typu podpisu, rzucaOverflowException zamiast zwracać liczbę ujemną. Na przykład:

Dim x As UShort = UShort.MaxValue
Dim y As Short = CShort(x)  ' Throws OverflowException

Warto też wspomnieć, żeDirectCast Operacja nie może być używana do rzutowania wartości między typami podpisanymi i niepodpisanymi, ponieważ żaden typ nie dziedziczy ani nie implementuje drugiego. Na przykład:

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'

Wymyśliłem jeden sposób na zrobienie tego, co chcę, ale wydaje się to niepotrzebnie brzydkie. Oto jak mam to do pracy:

Dim x As UShort = UShort.MaxValue
Dim y As Short = BitConverter.ToInt16(BitConverter.GetBytes(x), 0)  ' y gets set to -1

Tak jak powiedziałem, to działa, ale jeśli w VB.NET jest łatwiejszy i czystszy sposób, chciałbym wiedzieć, co to jest.

questionAnswers(11)

yourAnswerToTheQuestion