调用ctypes函数时,Python int溢出

我正在玩ctypes …我有以下C代码

编辑:我试图解决这个问题的原因是让this blog post更正确

sumrange.c

#include <stdio.h>

long sumrange(long);

long sumrange(long arg)
{
    long i, x;
    x = 0L;

    for (i = 0L; i < arg; i++) {
        x = x + i;
    }
    return x;
}

我使用以下命令编译(在OSX上)

$gcc -shared -Wl,-install_name,sumrange.so -o ./sumrange.so -fPIC ./sumrange.c

我在python中实现了相同的功能:

pysumrange = lambda arg: sum(xrange(arg))

然后我在交互式shell上运行:

>>> import ctypes
>>> sumrange = ctypes.CDLL('./sumrange.so')
>>> pysumrange = lambda arg: sum(xrange(arg))
>>> print sumrange.sumrange(10**8), pysumrange(10**8)
... 887459712 4999999950000000

……而且数字不匹配.为什么会这样?

我尝试使用无符号long long来处理C代码中的所有变量而没有效果(相同的输出).

解决方法:

long是32位类型,因此C代码只是溢出.

Python没有; pysumrange为您提供正确的答案.

除非你告诉它,否则ctypes不知道函数的返回类型是长对齐的.请参阅Python标准库文档中的return types.它说:

By default functions are assumed to return the C int type. Other return types can be specified by setting the restype attribute of the function object.

所以,在调用函数之前,这样做可能会对你有用:

sumrange.sumrange.restype = ctypes.c_ulonglong
上一篇:使用RaspberryPi的Python Ctypes


下一篇:如何在Linux下的luajit中捕获SIGUSR1?