我在使用 VB.Net 尝试将Long
转换为ULong.
时遇到问题
我尝试了很多组合并且不断出现溢出错误。
我的签名值为-2147483648,我知道转换后会有Ulong
2151196588。
但是我想以编程方式执行此操作,因为我正在解析可能为负数和正数的值,但是当数字为负数时,它们需要具有正确的ulong
值。
注意:绝对值不起作用,对于真值,它必须是ulong
。
谢谢。
答案 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