Как преобразовать целое без знака в целое со знаком без 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, я бы хотел знать, что это такое.

Ответы на вопрос(11)

Ваш ответ на вопрос