Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Cython无法将负值强制转换为无符号long_Python_C_Casting_Cython_Uint64 - Fatal编程技术网

Python Cython无法将负值强制转换为无符号long

Python Cython无法将负值强制转换为无符号long,python,c,casting,cython,uint64,Python,C,Casting,Cython,Uint64,我试图将Cython类中的一个大负值转换为uint64\u t类型变量。但我一直在犯这样的错误: 溢出错误:无法将负值转换为无符号长字符串 cdef uint64_t temp2 = <uint64_t>(temp - bitReversal(current_pos)) cdef uint64_t temp2=(临时位反转(当前位置)) 我从temp-bitcreversion(current\u pos)中得到的数字是-1152831344652320768,如果我硬编码它就可

我试图将Cython类中的一个大负值转换为uint64\u t类型变量。但我一直在犯这样的错误:

溢出错误:无法将负值转换为无符号长字符串

cdef uint64_t temp2 = <uint64_t>(temp - bitReversal(current_pos))
cdef uint64_t temp2=(临时位反转(当前位置))

我从
temp-bitcreversion(current\u pos)
中得到的数字是-1152831344652320768,如果我硬编码它就可以工作。现在,我构建了一个非常难看的黑客程序,将负数转换为相应的无符号数,但正如预期的那样,速度非常慢。

谢谢abarnert,它起了作用。 这条线使它工作:
cdef uint64_t temp2=(临时位反转(当前位置))

但这真的很奇怪,因为这两个变量都是uint64\u 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
def位反转(uint64\u t x):

x=((x&0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa我可以问一下,为什么要将负数转换为无符号值吗?我正在为类似国际象棋的游戏计算一个车的移动掩码。
(uint64\t)
对cythonar无效语法您要减去的两个数字都是正数吗?然后将它们都转换为
uint64\t
,然后依赖C无符号整数保证溢出行为这一事实。(执行有符号算术,然后强制转换为无符号并不能保证;这取决于这样一个事实,即您的平台的有符号数字是2s补码,以明显的方式实现,并且您的编译器不会假设它们不会溢出,并且在现代系统上,最后一部分可能并不总是正确的,即使前两部分是正确的.)这两个变量不可能都是
uint64\u t
,否则减法就不会是负数。你可能在某个地方缺少了
cdef
,所以其中一个变量被复制到了Python
int
的某个地方?在这种情况下,我相信Cython会通过将C值转换为Python并询问Python来进行减法n减去(除了这个溢出问题之外,这可能也是您希望避免的性能问题)。使用
cython-a myfile.pyx
并查找黄色。如果您的数学是黄色的,那么abarnert就有钱了。