带有故意溢出的python 32位和64位整数数学

带有故意溢出的python 32位和64位整数数学,python,integer-math,Python,Integer Math,在32位和64位中进行整数运算的最佳方法是什么,以便像在C中一样发生溢出 e、 g.(65536*65536+1)*(65536*65536+1)在64位数学中应为0x00000002000000001,而不是其精确值(非溢出)0x1000000200000001。仅&使用适当的32位或64位掩码(0xffffffff或0xffffffffffffff).与适当的整数大小一起使用,溢出更像C: 32位: >>> np.uint32(2**32-3) + np.uint32(5)

在32位和64位中进行整数运算的最佳方法是什么,以便像在C中一样发生溢出


e、 g.(65536*65536+1)*(65536*65536+1)在64位数学中应为0x00000002000000001,而不是其精确值(非溢出)0x1000000200000001。

&
使用适当的32位或64位掩码(
0xffffffff
0xffffffffffffff
).

与适当的整数大小一起使用,溢出更像C:

32位:

>>> np.uint32(2**32-3) + np.uint32(5)
__main__:1: RuntimeWarning: overflow encountered in uint_scalars
2
64位:

>>> i64=np.uint64(65536*65536+1)
>>> hex(i64*i64)
'0x200000001L'
与Python的本机int比较:

>>> hex((65536*65536+1)*(65536*65536+1))
'0x10000000200000001L'

您可以看到NumPy正在按您的意愿运行。

有符号溢出会导致C中出现未定义的行为,因此严格来说,这个问题毫无意义。^还有一个原因是C对某些类型的数值计算没有帮助:-(类似,但不是重复。32位问题(或16位,我没有问过)与int->long int行为不同。对于有符号int,您必须使用模运算,例如
%0x100000000
%0x10000000000000
。不幸的是,这不是真正有效的。与任何支持本机处理器大小整数的语言相比,位掩码也不是。NumPy公开它们,因此它可能是最好的解决方案仍然…NumPy可以忽略警告吗?这可能是最好的解决方案,因为它将是最快的解决方案,处理有符号/无符号,而不是在Python本机bigint端使用位掩码或模运算进行攻击。是的,您可以捕获或抑制错误和警告。您可以使用或使用多个NumPy o来实现这一点选择。