使用ctypes调用C库时Python无法正确输出long long整数问题排查
问题诊断:返回类型属性名错误导致的数值溢出
你遇到的问题核心是ctypes函数返回类型的属性名写错了——你用了restypes(复数),但正确的属性名是restype(单数)。
为什么会出现这个问题?
当你没有正确设置restype时,ctypes会默认把C函数的返回值当作C语言的int类型来解析。对于你的场景:
- 正确结果
4999950000已经超过了32位有符号整数的最大值(2^31-1 = 2147483647),甚至超过了32位无符号整数的上限(2^32-1 = 4294967295)。 - 这个大数值被当作32位整数处理时会发生溢出,最终得到你看到的
704982704(计算验证:4999950000 - 4294967296 = 704982704,正好是溢出后的结果)。 - 当
iterations=10000时,结果49995000在32位整数范围内,所以不会触发溢出,能得到正确值。
修正后的Python代码
只需要把属性名从复数改成单数即可:
import ctypes import os testlib = ctypes.cdll.LoadLibrary(os.getcwd()+"/libtest.so") sum_range = testlib.sum_range sum_range.argtypes = [ctypes.c_long] # 这里将restypes改为restype(单数) sum_range.restype = ctypes.c_longlong iterations=100000 print("sum_range(iterations) = {}".format(sum_range(iterations)))
验证效果
运行修正后的代码,就能得到正确结果:sum_range(iterations) = 4999950000。
这是ctypes里很容易踩的小坑,下次要注意区分属性名的单复数哦~
内容的提问来源于stack exchange,提问作者Alex van Houten
相关产品推荐
相关产品推荐

