От UInt32 до Int32 - PullRequest
       51

От UInt32 до Int32

2 голосов
/ 17 октября 2008

Если у меня есть функция VB.Net, которая возвращает Int32, но использует unsigned int (UInt32) для вычислений и т. Д. Как преобразовать переменную «MyUintVar32» со значением, скажем «3392918397, в стандартный Int32 VB.Net?

В c #, если я просто делаю "return (int) (MyUintVar32);", я получаю -902048899, а не ошибку.

Я пробовал несколько разных методов. В чем разница в том, как c # обрабатывает эти преобразования по сравнению с VB.Net?

Ответы [ 5 ]

6 голосов
/ 01 апреля 2011

Я понимаю, что это старый пост, но на вопрос не ответили. Другие люди, которых я хочу знать:

Dim myUInt32 As UInt32 = 3392918397  
Dim myInt32 As Int32 = Convert.ToInt32(myUInt32.ToString("X"), 16)  

обратная операция:

myUInt32 = Convert.ToUInt32(myInt32.ToString("X"), 16)

Кроме того, можно создать структуру объединения для простого преобразования между Int32 и UInt32:

Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Explicit)> _    
  Public Structure UnionInt32  
  <FieldOffset(0)> _  
  Public IntValue As Int32  
  <FieldOffset(0)> _  
  Public UIntValue As UInt32  
End Structure  

Dim MyUnionInt32 as UnionInt32  
MyUnionInt32.UIntValue = 3392918397  
Dim IntVal as Int32 = MyUnionInt32.UIntValue  '= -902048899 

обратная операция:

MyUnionInt32.IntValue = -902048000  
Dim UIntVal as UInt32 = MyUnionInt32.UIntValue  '= 3392919296  

Приветствия, TENware

3 голосов
/ 17 октября 2008

3392918397 слишком велик, чтобы поместиться в 32-разрядное целое число со знаком, поэтому оно получается отрицательным, поскольку установлен старший значащий бит из 3392918397.

1100 1010 0011 1011 1101 0011 0111 1101

Если вы хотите, чтобы целые числа в этой пропорции содержались внутри целочисленного типа со знаком, вам нужно использовать следующий размер - 64-битное целое число со знаком.

2 голосов
/ 17 октября 2008

Это не оптимальное решение, но вы можете использовать BitConverter, чтобы получить байтовый массив из uint и преобразовать байтовый массив в int.

Dim myUInt32 As UInt32 = 3392918397
Dim myInt32 As Int32 = BitConverter.ToInt32(BitConverter.GetBytes(myUInt32), 0)
0 голосов
/ 17 октября 2008

Или после выполнения работы Uint32, проверьте его по MAXINT и 0.

Если> MAXINT и <0, то все в порядке. Если нет, то вы «переполнены» и должны выбросить исключение. </p>

Я не помню, определен ли MAXINT. Вы можете использовать: 2 ^ 31 - 1 вместо.

0 голосов
/ 17 октября 2008

Нельзя преобразовать 3392918397 в Int32, поскольку это число слишком велико, чтобы поместиться в 31 бит. Почему бы просто не изменить функцию, чтобы она возвращала UInt32?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...