0

我在使用VB.Net尝试将 a 转换Long为 a时遇到问题,ULong. 我尝试了许多组合并不断出现溢出错误。我的有符号值为 -2147483648,我知道Ulong一旦转换它就会有 2151196588。

但是我想以编程方式执行此操作,因为我正在解析可以是负数和正数的值,但是当数字为负数时,它们需要具有正确的ulong值。注意:绝对值不起作用,它需要ulong为真值。谢谢你。

4

4 回答 4

2

您可以使用 BitConverter 类:

Dim a As Int64 = -2147483648
Dim b = BitConverter.ToUInt64(BitConverter.GetBytes(a), 0)
Console.WriteLine(b.ToString) ' outputs: 18446744071562067968

您确定您的预期值 2151196588 是正确的吗?

于 2013-02-22T23:01:55.217 回答
2

如果你的意思是reinterpret_cast<ulong>(long),然后使用相同的技术

<Runtime.InteropServices.StructLayout(Runtime.InteropServices.LayoutKind.Explicit)> _
Public Structure LongULongUnion
    <Runtime.InteropServices.FieldOffset(0)> Public l As Long
    <Runtime.InteropServices.FieldOffset(0)> Public ul As ULong
End Structure


Sub Main()
    Dim u As LongULongUnion

    u.l =  -2147483648L
    Console.WriteLine(u.ul)

    Console.ReadLine()
End Sub

但这会18446744071562067968在转换时给出。

于 2013-02-22T21:46:48.127 回答
2

这是将任何Long 转换为 ULong 的最简单方法:

Dim x As Long = -2147483648
Dim y As ULong = Not (CType((Not x), ULong)) ' = 18446744071562067968

我是一名 C# 程序员,所以如果我将它错误地转换为 VB.NET,请纠正我。我的 C# 代码是:

long x = -2147483648;
ulong y = ~((ulong)~x); // = 18446744071562067968

基本上你取负值的补码,它总是一个正值。然后,您可以安全地将其转换为 ULong。再次取补码,您就可以将相同的位模式转换为 ULong。

于 2013-02-22T23:54:39.427 回答
0

确保在将值转换为 ulong 之前将其转换为正值,负值不在 ulong 的值范围内。

long: -9223372036854775808 to 9223372036854775807
ulong: 0 to 18446744073709551615
于 2013-02-22T21:44:12.673 回答