10

在 Python 中,当一个 int 大于 2**31 时,它会变成一个 long:

a = 2147483647 a + 1 = 2147483648

b = -2147483648 b - 1 = -2147483649

但我需要像 C 中的 int 一样的 Python int 溢出:

a = 2147483647 a + 1 = -2147483648

b = -2147483648 b - 1 = 2147483647

可能吗?提前致谢!

4

2 回答 2

6

尝试 numpy:

>>> x = numpy.int32(2147483647)
>>> x
2147483647
>>> type(x)
<type 'numpy.int32'>
>>> x+1
__main__:1: RuntimeWarning: overflow encountered in long_scalars
-2147483648
>>> type(x+1)
<type 'numpy.int32'>

只需确保int在将它们传递给期望正常 Python 溢出行为的代码之前调用这些东西。

于 2013-09-13T04:18:44.023 回答
3

您可以定义自己的类并覆盖__int__()特殊方法以及各种其他数学运算符特殊方法,以模拟数字类型。然后您的类可以保持该值始终在适当范围内的不变量。

例如:

def class Int32:
    def __init__(self):
        self.value = 0

    def __init__(self, value):
        # Wrap value into [-2**31, 2**31-1]
        self.value = (value + 2**31) % 2**32 - 2**31

    def __int__(self):
        return self.value

    def __add__(self, other):
       return Int32(self.value + other.value)

    # ... etc. for other mathematical operators
于 2013-09-13T03:35:11.500 回答