Я хотел бы иметь возможность конвертировать высокозначное беззнаковое целое число (значение, которое использует бит наивысшего порядка) в целое число со знаком. В этом случае мне все равно, что значение больше максимального значения знакового целочисленного типа. Я просто хочу, чтобы он конвертировался в то, что битовые значения представляют как знак-целое. Другими словами, я ожидаю, что это приведет к отрицательному числу.
Однако с VB.NET операция CType
не работает (или любая другая функция преобразования, такая как CShort
и CInteger
). Когда вы пытаетесь преобразовать значение без знака, которое превышает требуемое максимальное значение подписанного типа, оно выдает OverflowException
вместо возврата отрицательного числа. Например:
Dim x As UShort = UShort.MaxValue
Dim y As Short = CShort(x) ' Throws OverflowException
Следует также отметить, что операция DirectCast
не может использоваться для передачи значения между типами signed и unsigned, поскольку ни один из них не наследует или не реализует другое. Например:
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 есть более простой и понятный способ сделать это, я хотел бы знать, что это такое.