cython中的奇怪整数行为

时间:2017-08-23 21:42:43

标签: python c cython

我遇到了一个奇怪的问题,在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

1 个答案:

答案 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),   所以结果被更改为返回无符号值。在另一   我同意使用无符号值也很混乱,   特别是因为同等排名整数的推广是对未签名的   输入所以它具有传染性。不清楚最佳行动方案是什么   这里...