Python3中的整数溢出

问题描述 投票:3回答:2

我是Python的新手,我正在阅读this页面,在那里我看到了一个奇怪的声明:

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 integer integer-overflow
2个回答
3
投票

Python3

只有浮点数在python中有一个硬限制。整数是are implemented as “long” integer objects of arbitrary size in python3do normally not overflow

您可以使用以下代码测试该行为

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_infosys.maxsize

Python2

在python2中,如果documentation for numeric types中描述的过大,则整数会自动转换为长整数

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
# inf

the docs for float中所述,Python对于无穷大(以及负无穷大)也有一个特殊的浮点值


5
投票

整数在Python中不起作用。

但浮动确实如此。这也是为什么评论说1e300,这是一个科学记数字的浮动。

© www.soinside.com 2019 - 2024. All rights reserved.