Как преобразовать целое без знака в целое со знаком без OverflowException

Я хотел бы иметь возможность преобразовать высокозначное целое число без знака (значение, которое использует бит самого высокого порядка) в целое число со знаком. В этом случае я неt важно, чтобы это значение превышало максимальное значение целочисленного типа со знаком. Я просто хочу, чтобы оно преобразовывалось во все значения битов, представленные в виде целого числа со знаком. Другими словами, я ожидал бы, что это приведет к отрицательному числу.

Тем не менее, с 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)

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