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