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
这会产生这个错误:
“OverflowError:Python int 太大,无法转换为 C long”
我还尝试将它们声明为无符号长整型。我应该使用什么类型来处理非常大的数字?如果它对于 c 来说太大了,有什么解决方法吗?
cython编译pyx文件到C,因此它取决于底层C编译器。
C 中整数类型的大小在不同平台和操作系统上有所不同,并且 C 标准没有规定确切的实现。
然而,存在事实上的实施约定。
32 位和 64 位的 Windows 使用 4 个字节(32 位)int
and long
, 8 字节(64 位)long long
。 Win32 和 Win64 之间的区别在于指针的大小(Win32 为 32 位,Win64 为 64 位)。 (看数据类型范围 http://msdn.microsoft.com/en-us/library/s3f49ktz.aspx] 来自 MSDN)。
Linux 使用另一种模型:int
linux-32 和 linux-64 都是 32 位,long long
始终是 64 位。long
并且指针有所不同:linux-32 上为 32 位,linux-64 上为 64 位。
长话短说:如果您需要整数类型的最大容量,并且该容量在不同平台上不会改变,请使用long long
(or unsigned long long
).
数据范围为long long
is [–9223372036854775808, 9223372036854775807]
.
如果您需要任意精度的数字,则有GMP库 https://gmplib.org/——高精度算术的事实上的标准。 Python 有它的包装器,称为gmpy2 https://pypi.python.org/pypi/gmpy2.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)