我会把我的两分钱扔在这里。
首先,其他答案中提出的使用外部 typedef 的解决方案不仅仅是一种解决方法,这就是 Cython 文档所说的应该做这样的事情的方式。请参阅相关部分。引用:“如果头文件使用 typedef 名称,例如word
指代数字类型的平台相关风格,您将需要相应的 ctypedef 语句,但您不需要完全匹配类型,只需使用正确的通用名称kind (int, float, etc). 例如,ctypedef int word
无论 a 的实际大小是多少,都可以正常工作word
(只要头文件正确定义它)。与 Python 类型的转换(如果有的话)也将用于这种新类型。 "
此外,没有必要为您已经在其他地方包含的类型实际创建带有 typedef 的头文件。就这样做
cdef extern from *:
ctypedef int int128 "__int128_t"
或者,如果您想让 Cython 中的名称与 C 中的名称相同,
cdef extern from *:
ctypedef int __int128_t
这是一个测试来证明这是有效的。如果 128 位算术有效a > 1
,并且 a 可以表示为 64 位整数,则第一个函数将再次打印相同的数字。如果不是,整数溢出应该导致它打印 0。第二个函数显示如果使用 64 位算术会发生什么。
赛通文件
# cython: cdivision = True
cdef extern from *:
ctypedef int int128 "__int128_t"
def myfunc(long long a):
cdef int128 i = a
# set c to be the largest positive integer possible for a signed 64 bit integer
cdef long long c = 0x7fffffffffffffff
i *= c
cdef long long b = i / c
print b
def myfunc_bad(long long a):
cdef long long i = a
# set c to be the largest positive integer possible for a signed 64 bit integer
cdef long long c = 0x7fffffffffffffff
i *= c
cdef long long b = i / c
print b
在 Python 中,在导入两个函数后,myfunc(12321)
打印正确的值,同时myfunc_bad(12321)
打印 0。