UInt64在做大数学时会感到不确定



我从一些大数学中得到了一个奇怪的结果;我不知道为什么我从vb.net和python中得到了不同的答案。

以下是快速片段&结果:

VB.NET
Dim MSB As UInt32 = 3067297518
Dim LSB As UInt32 = 1439785590
Dim sqln As UInt64 = MSB * (2 ^ 32) + LSB 
Python:
sqln = msb * (2 ** 32) + lsb
Python Result: 13173942528351756918
VB RESULT:     13173942528351756288

注意:我还尝试将sqln声明为ULong和Double(答案相同)MSB和LSB在两个调试器中都匹配-??

有什么想法吗我的感谢

卓尔不群的乔恩-非常能说会道;它有效!你能为最后一件作品提出一个修复方案吗?我相信同样的事情正在发生,尽管你已经理顺了我的sqln:)

python says: = bdntyxtax2smq
vb.net says: = bfpuzytbx3s00
VB.NET
Dim sqlid As String = ""
Dim alphabet As String = "0123456789abcdfghjkmnpqrstuvwxyz"
For iCount = 0 To 12
    sqlid = alphabet((sqln / (32 ^ iCount)) Mod 32) + sqlid
Next
Python:
for i in range(0, 13):
    sqlid = alphabet[(sqln / (32 ** i)) % 32] + sqlid

我已经将您的VB代码反编译为C#,它看起来像这样:

uint MSB = 0xb6d33eee;
uint LSB = 0x55d16276;
ulong sqln = (ulong) Math.Round((double) ((num2 * 4294967296) + num));

这是因为VB中的功率运算符总是返回Double:

结果是一个幂为指数的数字,始终为Double值。

我建议使用移位运算符,并将所有变量设为UInt64,以便将移位为一个64位整数:

Dim MSB As UInt64 = 3067297518
Dim LSB As UInt64 = 1439785590
Dim sqln As UInt64 = (MSB << 32) + LSB 

这给出了正确的答案。(您实际上并不需要LSBUInt64,但您还可以用64位整数执行所有操作。)

相关内容

  • 没有找到相关文章

最新更新