Cómo convertir un entero sin signo en un entero con signo sin OverflowException

Me gustaría poder convertir un entero sin signo de alto valor (un valor que utiliza el bit de orden superior) en un entero con signo. En este caso, no me importa que el valor sea más alto que el valor máximo del tipo entero con signo. Solo quiero que se convierta a lo que representen los valores de bits como un entero con signo. En otras palabras, esperaría que diera como resultado un número negativo.

Sin embargo, con VB.NET, elCType la operación no funciona de esa manera (o cualquiera de las otras funciones de conversión comoCShort yCInteger). Cuando intenta convertir un valor sin firmar que es más alto que el valor máximo del tipo con signo deseado, arroja unOverflowException en lugar de devolver un número negativo. Por ejemplo:

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

Vale la pena mencionar, también, que elDirectCast La operación no se puede utilizar para convertir el valor entre los tipos con signo y sin signo, ya que ninguno de los tipos hereda o implementa el otro. Por ejemplo:

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'

He descubierto una forma de hacer lo que quiero, pero parece innecesariamente fea. Así es como lo hice funcionar:

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

Como dije, eso funciona, pero si hay una forma más fácil y limpia de hacerlo en VB.NET, me encantaría saber qué es.

Respuestas a la pregunta(11)

Su respuesta a la pregunta