2

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

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

我尝试了几种不同的方法。c# 处理这些转换的方式与 VB.Net 有什么区别?

4

5 回答 5

7

我意识到这是一个旧帖子,但问题尚未得到解答。我想知道的其他人:

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

于 2011-04-01T16:58:32.470 回答
3

3392918397 太大而无法放入带符号的 32 位整数中,这就是它出现负数的原因,因为设置了 3392918397 的最高有效位。

1100 1010 0011 1011 1101 0011 0111 1101

如果你想在有符号整数类型中保持这个比例的整数,你需要使用下一个大小,一个 64 位有符号整数。

于 2008-10-16T21:35:33.513 回答
2

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

Dim myUInt32 As UInt32 = 3392918397
Dim myInt32 As Int32 = BitConverter.ToInt32(BitConverter.GetBytes(myUInt32), 0)
于 2008-10-16T21:35:33.013 回答
0

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

于 2008-10-16T21:36:41.140 回答
-1

或者在完成 Uint32 工作后,对照 MAXINT 和 0 检查它。

如果 > MAXINT 和 < 0 那么你没问题。如果不是你“溢出”并且应该抛出异常。

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

于 2008-10-16T21:46:33.273 回答