【发布时间】:2025-11-30 22:50:01
【问题描述】:
我正在尝试将 Cython 类中的一个很大的负值转换为 uint64_t 类型变量。但我不断收到此错误:
溢出错误:无法将负值转换为无符号长
cdef uint64_t temp2 = <uint64_t>(temp - bitReversal(current_pos))
我从temp - bitReversal(current_pos) 得到的号码是 -1152831344652320768,如果我对其进行硬编码,它就可以工作。现在,我构建了一个非常丑陋的 hack,将负数转换为相应的无符号数,但正如预期的那样非常慢。
【问题讨论】:
-
将
<uint64_t>更改为(uint64_t)? (并接受溢出。) -
请问为什么你试图将负数转换为无符号值?
-
我正在为类似国际象棋的游戏计算车的移动掩码。
(uint64_t)不是 cython 的有效语法 -
你减去的两个数字都是正数吗?然后只需将它们都转换为
uint64_t,然后依靠 C 无符号整数保证溢出行为这一事实。 (进行有符号算术然后强制转换为无符号是不保证的;它依赖于这样一个事实,即您平台的有符号数是 2 秒补码,以明显的方式实现,并且您的编译器不会做出假设它们不会溢出——最后一部分在现代系统上可能并不总是正确的,即使前两部分是这样。)
标签: python c casting cython uint64