我遇到了一个奇怪的问题,在cython中有一些整数操作。当我编译这个cython代码时......
test.pyx
from libc.math cimport abs
cdef int c = 2047
cdef int b = 1009
print('%d'%(-(abs(b)&c)))
......喜欢这个
#!python
from subprocess import check_output
CFLAGS = check_output('python-config --cflags'.split()).decode('utf-8').strip()
LDFLAGS = check_output('python-config --ldflags'.split()).decode('utf-8').strip()
check_output('cython test.pyx'.split())
compile_call = ('clang -c test.c %s'%(CFLAGS)).split()
check_output(compile_call)
link_call = ('clang test.o -o test.so -shared %s'%(LDFLAGS)).split()
check_output(link_call)
import test
...我得到2130706744
,但正确答案为-1009
。
答案 0 :(得分:2)
看起来这可能是Cython中的一个错误。 test.c
中的相关行是
__pyx_t_2 = __Pyx_PyInt_From_unsigned_int((-(__pyx_t_1 & __pyx_v_4test_c)));
明确地将我们的号码解释为无符号会给出错误的答案。但是,如果我删除了abs
来电,那么我会
__pyx_t_1 = __Pyx_PyInt_From_int((-(__pyx_v_4test_b & __pyx_v_4test_c)));
,结果是正确的。如果我像print('%d'%(-(<int>abs(b)&c)))
那样向int添加一个强制转换,那么我也会得到正确答案。
交叉发布到Cython github page
更新:以下是对我的github问题的回复:
基本上,有符号的int不足以容纳abs(-MAX_INT-1), 所以结果被更改为返回无符号值。在另一 我同意使用无符号值也很混乱, 特别是因为同等排名整数的推广是对未签名的 输入所以它具有传染性。不清楚最佳行动方案是什么 这里...