Python中的DWORD乘法
我遇到了一个问题,找了很久也没找到答案。
在一个用PowerBuilder写的应用程序里,有一个bug(没及时发现),这个bug的表现是:long * long
的结果是long
(而不是longlong
),所以输出的结果有点奇怪。现在我需要在Python中实现同样的功能。例如:
a = 3423729
b = 96300
c = a*b = 329705102700
PowerBuilder的输出是:
c = a*b = -1007379092
经过进一步测试,似乎这个结果是一个带符号的32位整数,但我在Python中无法得到这样的结果。不管怎样,使用计算器进行双字节乘法,结果是-1007379092
。有没有什么办法可以解决这个问题?
3 个回答
1
看起来你的应用程序正在取结果的最右边32位,这些位数被表示为一个32位的整数。
你可以使用ctypes
库中的类型来表示特定大小的有符号和无符号整数,方法类似。对于一个有符号的32位整数:
>>> import ctypes
>>> c = 329705102700
>>> ctypes.c_int32(c).value
-1007379092
1
我不太明白你为什么想这么做,因为Python会动态分配存储空间,专门用来避免整数溢出。如果你真的想模拟一下溢出的情况,可以试试下面的代码:
import ctypes
a, b = 3423729, 96300
c = ctypes.c_int(a * b)
print(c.value)
3
你可以使用 ctypes
这个包:
>>> from ctypes import c_int32
>>> a = 3423729
>>> b = 96300
>>> c_int32(a*b).value
-1007379092