Cython不能将负值转换为unsigned long

时间:2014-09-18 23:10:08

标签: python c casting cython uint64

我试图在Cython类中将一个很大的负值转换为uint64_t类型变量。但我一直收到这个错误:

OverflowError:无法将负值转换为无符号长

cdef uint64_t temp2 = <uint64_t>(temp - bitReversal(current_pos))

我从temp - bitReversal(current_pos)得到的号码是-1152831344652320768,如果我对它进行硬编码就行了。现在我构建了一个非常丑陋的黑客,将负数转换为相应的无符号数,但正如预期的那样非常慢。

1 个答案:

答案 0 :(得分:1)

感谢abarnert工作。 这条线使它工作: cdef uint64_t temp2 = <uint64_t>(temp - <uint64_t>bitReversal(current_pos))

但这很奇怪,因为两个变量的类型都是uint64_t。

def bitReversal(uint64_t x):
    x = (((x & 0xaaaaaaaaaaaaaaaa) >> 1) | ((x & 0x5555555555555555) << 1))
    x = (((x & 0xcccccccccccccccc) >> 2) | ((x & 0x3333333333333333) << 2))
    x = (((x & 0xf0f0f0f0f0f0f0f0) >> 4) | ((x & 0x0f0f0f0f0f0f0f0f) << 4))
    x = (((x & 0xff00ff00ff00ff00) >> 8) | ((x & 0x00ff00ff00ff00ff) << 8))
    x = (((x & 0xffff0000ffff0000) >> 16) | ((x & 0x0000ffff0000ffff) << 16))
    cdef uint64_t result = <uint64_t>((x >> 32) | (x << 32))
    return result