![d16ec52f2ed32ede8664e28a82a61634.png](https://i-blog.csdnimg.cn/blog_migrate/d218b9b64776f1537d200a3d9ca5377d.jpeg)
事情是这样的,在头条看到一篇文章《【基础篇】Python+Go——带大家一起另寻途径提高计算性能》,文章中发现一个问题,但并没说问题的解决。问题如下:当动态库接口函数返回一个int64类型的返回值,python调用这个接口函数后,接收函数返回值时只有低4个字节的数据位。原文章是用golang生成的动态库,本人用C写了个简单的动态库接口来复现这个问题,接口的声明和定义如下:
dll.h
__int64 retint64(void);
dll.c
__int64 retint64(void){ return 0x746A4AE6E0; }
在python中调用代码如下:
import ctypes dll = ctypes.CDLL('s1.dll') int64_r = dll.retint64() print("int64_r = 0x%X"% int64_r);
python执行的结果:
int64_r = 0x6A4AE6E0
上述C动态库的环境是MinGw64(gcc 8.1.0是64位),python的版本3.7.6(64位),OS系统是windows7(64位),linux的环境尚未试验。
gcc -v
gcc version 8.1.0 (x86_64-posix-seh-rev0, Built by MinGW-W64 project)
python
Python 3.7.6 (tags/v3.7.6:43364a7ae0, Dec 19 2019, 00:42:30) [MSC v.1916 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information.
本人分析出现这个问题的原因是python在处理动态库的函数返回值时用一个int32类型数据(4字节)来接收,超过4字节的有效位数就会丢弃。这应该是python的一个小bug,欢迎各位看官讨论。