4

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

编辑:我试图弄清楚这一点的原因是让这篇博文更正确

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

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

我尝试使用unsigned long longC 代码中的所有变量,但没有效果(相同的输出)。

4

1 回答 1

6

long是 32 位类型,所以 C 代码简单地溢出。

Python 没有;pysumrange给你正确的答案。

ctypesunsigned long long除非你告诉它,否则不知道函数的返回类型是什么。请参阅Python 标准库文档中的返回类型。它说:

默认情况下,假定函数返回 Cint类型。其他返回类型可以通过设置restype函数对象的属性来指定。

所以也许在调用函数之前这样做会对你有用:

sumrange.sumrange.restype = ctypes.c_ulonglong
于 2012-09-12T19:06:48.237 回答