Python3中的整数溢出
我是 Python 新手,我在阅读此页面时看到了一个奇怪的声明:
if n+1 == n: # catch a value like 1e300 raise OverflowError("n too large")
x 等于比它大的数?!我感觉到原力中出现了干扰。
我知道在 Python 3 中,整数没有固定的字节长度。因此,不存在整数溢出,就像 C 的int工作方式一样。但存储器当然不能存储无限的数据。
我认为这就是为什么结果n+1可以与n:Python无法分配更多内存来执行求和,因此它被跳过,并且n == n是正确的。那是对的吗?
如果是这样,可能会导致程序结果不正确。为什么 Python 在无法执行操作时不会像 C++ 那样抛出错误std::bad_alloc?
即使n不是太大并且检查结果为假,result- 由于乘法 - 也将需要更多的字节。会result *= factor因为同样的原因失败吗?
我在Python官方文档中找到了它。这真的是检查大整数/可能的整数“溢出”的正确方法吗?
问题回答
在Python中只有浮点数有硬限制。整数在 python3 中被实现为任意大小的“长”整数对象,并且通常不会溢出。您可以使用以下代码测试该行为
import sys i = sys.maxsize print(i) # 9223372036854775807 print(i == i + 1) # False i += 1 print(i) # 9223372036854775808 f = sys.float_info.max print(f) # 1.7976931348623157e+308 print(f == f + 1) # True f += 1 print(f) # 1.7976931348623157e+308您可能还想看看sys.float_info和sys.maxsize
Python2
在 python2 中,如果整数太大,则会自动转换为长整数,如数字类型文档中所述
import sys i = sys.maxsize print type(i) # <type 'int'> i += 1 print type(i) # <type 'long'>
会result *= factor因为同样的原因失败吗?
为什么不尝试一下呢?import sys i = 2 i *= sys.float_info.max print i # infPython 有一个特殊的无穷大浮点值(也有负无穷大),如浮点文档中所述