4

我从一些大数学中得到了一个奇怪的结果,不知道为什么我从 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
4

1 回答 1

4

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

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

这是因为VB中的幂运算符Double总是返回 a :

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

我建议使用移位运算符,并制作所有变量UInt64,以便将移位完成64 位整数:

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

这给出了正确的答案。(你实际上不需要LSB是 a UInt64,但你也可以用 64 位整数来做所有事情。)

于 2012-03-01T20:40:50.717 回答