Python中的DWORD乘法

3 投票
3 回答
1538 浏览
提问于 2025-04-18 12:37

我遇到了一个问题,找了很久也没找到答案。

在一个用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

撰写回答