Cython не может привести отрицательное значение к unsigned long

Я пытаюсь привести большое отрицательное значение внутри класса Cython к переменной типа uint64_t. Но я продолжаю получать эту ошибку:

OverflowError: невозможно преобразовать отрицательное значение в unsigned long

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

Номер, который я получаю от temp - bitReversal(current_pos) -1152831344652320768 и если я жестко запрограммировал его, он работает. На данный момент я создаю действительно уродливый хак, преобразовывающий отрицательное число в соответствующее беззнаковое, но, как и ожидалось, очень медленно.

1 ответ

Спасибо, что работал. Эта Линия заставила это работать: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
Другие вопросы по тегам