UInt32到Int32

时间:2008-10-16 21:30:22

标签: vb.net overflow

如果我有一个返回Int32的VB.Net函数,但是使用unsigned int(UInt32)进行计算等。如何将值为“3392918397”的变量“MyUintVar32”转换为标准Int32 in VB.Net?

在c#中如果我只是做一个“return(int)(MyUintVar32);”,我得到-902048899,而不是错误。

我尝试了几种不同的方法。与VB.Net相比,c#处理这些转换的方式有何不同?

5 个答案:

答案 0 :(得分:6)

我意识到这是一个老帖子,但这个问题还没有得到解答。我想知道的其他人:

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

答案 1 :(得分:3)

3392918397太大而不适合签名的32位整数,这就是为什么它会出现负数,因为3392918397的最高位被设置了。

1100 1010 0011 1011 1101 0011 0111 1101

如果要在有符号整数类型中维护此比例的整数,则需要使用下一个大小,即64位有符号整数。

答案 2 :(得分:2)

这不是最佳解决方案,但您可以使用BitConverter从uint获取字节数组并将字节数组转换为int。

Dim myUInt32 As UInt32 = 3392918397
Dim myInt32 As Int32 = BitConverter.ToInt32(BitConverter.GetBytes(myUInt32), 0)

答案 3 :(得分:0)

您无法将3392918397转换为Int32,因为该数字太大而无法容纳31位。为什么不直接更改函数以返回UInt32?

答案 4 :(得分:-1)

或者在完成Uint32工作后,检查MAXINT和0.

如果&gt; MAXINT和&lt; 0然后你没事。如果不是你“溢出”并且应该抛出异常。

我不记得是否定义了MAXINT。您可以使用:2 ^ 31 - 1代替。