以下是引用sych在2022-5-5 08:22:36的发言:
尺有所短,寸有所长
与其讨论性能上的瓶颈,不如直接把问题抛出来,大家一起寻求解决办法
举个例子。设:
N1 = 3772834016 &&即16进制0xE0E0 E0E0
N2 = 2880154539 &&即16进制0xABAB ABAB
在VFP中,是无法计算N1+N2=?,因结果超出了32位整型数的最大值范围,导致结果数值溢出。
又或者:
N1 = 247256450130144 &&即16进制0xE0E0 E0E0 E0E0
N2 = 188753807911851 &&即16进制0xABAB ABAB ABAB
在VFP中,我们也无法计算N1-N2=?,因N1和N2都超出了32位整型数的范围。
那么,可以想到的解决方案,似乎是:
将64位整型数,按32位分割成高低两段,分别进行计算,然后再小心处理一下高低两段之间的进位与借位即可。
大整数用16进制来表示与储存会比较方便一些,起码比较直观(0xE0E0 E0E0 E0E0远比247256450130144优雅漂亮好多,不是吗?)
然而,在DBF表当中,则不应将0xE0E0 E0E0 E0E0储存为ASCII字符串“0000E0E0E0E0E0E0”,因为那意味着将原本64位(8字节)的数据,储存为16字节的字符串,长度扩大了一倍,计算开销也扩大了一倍,无形之中,也就失去了“字符串哈希”的意义了。
也就是说,0xE0E0 E0E0 E0E0应当保存为可变长二进制型(Q,Varbinary):0h0000E0E0E0E0E0E0,仍为64位(8字节)。
现在问题来了。如何高效在地在两种类型之间相互转换:
3772834016 ←→ 0hE0E0E0E0
2880154539 ←→ 0hABABABAB
还有,可变长二进制型(Q,Varbinary)在索引、检索与一些函数方面的限制,会不会对我们进行64位整型数模拟计算时,造成不必要的麻烦?
我觉得,这可能也是需特别注意的问题。