Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/325.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/8/python-3.x/19.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与大int一起使用时发生溢出错误_Python_Python 3.x_Cython - Fatal编程技术网

Python 将cython与大int一起使用时发生溢出错误

Python 将cython与大int一起使用时发生溢出错误,python,python-3.x,cython,Python,Python 3.x,Cython,python 3.4、windows 10、cython 0.21.1 我正在用cython将这个函数编译成c def weakchecksum(data): """ Generates a weak checksum from an iterable set of bytes. """ cdef long a, b, l a = b = 0 l = len(data) for i in range(l): a += data[i]

python 3.4、windows 10、cython 0.21.1

我正在用cython将这个函数编译成c

def weakchecksum(data):
   """
   Generates a weak checksum from an iterable set of bytes.
   """
   cdef long a, b, l
   a = b = 0
   l = len(data)
   for i in range(l):
       a += data[i]
       b += (l - i)*data[i]

   return (b << 16) | a, a, b
def weakchecksum(数据):
"""
从一组可编辑的字节生成弱校验和。
"""
cdef长a、b、l
a=b=0
l=len(数据)
对于范围(l)中的i:
a+=数据[i]
b+=(l-i)*数据[i]
return(bcython将pyx文件编译为C,因此它依赖于底层C编译器

C中整数类型的大小在不同的平台和操作系统上有所不同,C标准并没有规定具体的实现

然而,有事实上的执行公约

32位和64位Windows使用4个字节(32位)表示
int
long
,8个字节(64位)表示
long
。Win32和Win32之间的区别在于指针的大小(Win32为32位,Win32为64位)。(请参阅MSDN中的]

Linux使用另一种模式:
int
对于Linux-32和Linux-64都是32位,
long
始终是64位。
long
指针不同:Linux-32上是32位,Linux-64上是64位

长话短说:如果您需要整数类型的最大容量,而该类型在不同平台上没有更改,请使用
Long-Long
(或
unsigned-Long

long-long
的数据范围是
[-9223372036854775808,9223372036854775807]


如果您需要具有任意精度的数字,则有一个事实上的高精度算术标准。Python为其调用了wrapper。

如果您确保您的计算是用c进行的(例如,将i声明为long,并将数据元素放入cdefed变量或在计算之前强制转换),您不会得到此错误。但是,您的实际结果可能会因平台而异,具体取决于(可能)生成的确切汇编代码和溢出的处理。正如@cod3monk3y所指出的,有更好的算法可以解决此问题(请查看“简单校验和”链接).

cdef long long如何?
?同样的错误,导致它的数字是2891688164113197考虑创建一个大整数类?它将是一个包含数字的链表。是的,我考虑过,我正在使用cython来加速一些代码,并希望避免创建特殊类,从而增加gcc上的开销Ubuntu14.04,大约是9.2e+18,距离极限。h它正好是
define LLONG_MAX 9223372036854775807LL
see;unsigned long long long更大。是的,你在windows上看到了,但这应该是关于多少位适合硬件级算法的。所以我在cdef语句中添加了'I'并重新运行了它。仍然得到了相同的错误。还有ied cdef long long a、b、l、iTry
cdef long d…
(循环中)
d=data[i]
或在计算中使用
d
(或使用
data[i]
)。您可以使用一个标志进行编译,以查看注释中使用python行生成的实际c代码——您应该看到,当没有涉及python变量时,计算是一个直接的c表达式。(注意:由于某些原因,我无法在标记中正确拼写:))完美。。我已经放弃了这个问题的答案。成功了。你是个天才。对于你们这些在未来阅读这篇文章的人。我声明cdef长为a、b、l、I、d,并将对数据[I]的每个引用都更改为d。