Visual Basic.Net将long转换为Ulong

时间:2013-02-22 21:39:32

标签: vb.net type-conversion long-integer

我在使用 VB.Net 尝试将Long转换为ULong.时遇到问题 我尝试了很多组合并且不断出现溢出错误。 我的签名值为-2147483648,我知道转换后会有Ulong 2151196588。

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

4 个答案:

答案 0 :(得分:2)

如果您的意思是reinterpret_cast<ulong>(long),请使用same technique

<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

答案 1 :(得分:2)

您可以使用BitConverter类:

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

您确定您的预期价值2151196588是否正确?

答案 2 :(得分: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。

答案 3 :(得分:0)

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

long: -9223372036854775808 to 9223372036854775807
ulong: 0 to 18446744073709551615