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