在32位和64位中进行整数数学运算的最佳方法是什么,这样溢出就像在C中一样?
e.g。 (65536 * 65536 + 1)*(65536 * 65536 + 1)在64位数学运算中应为0x0000000200000001,而不是其精确值(非溢出)0x10000000200000001。
答案 0 :(得分:23)
使用适当的32位或64位掩码(&
或0xffffffff
)只需0xffffffffffffffff
个结果。
答案 1 :(得分:15)
使用具有适当整数大小的NumPy,溢出更像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的native int进行比较:
>>> hex((65536*65536+1)*(65536*65536+1))
'0x10000000200000001L'
你可以看到NumPy正在按你的意愿行事。