所以你想抛弃“唯一正确的方法”并在溢出问题上复古。你傻。
C / C++ / C# / Java 风格的溢出没有什么好处。它不能可靠地引发错误情况 https://stackoverflow.com/questions/103654/why-dont-languages-raise-errors-on-integer-overflow-by-default。对于 C 和 C99,它是 ANSI 和 POSIX 中的“未定义行为”(C++ 要求模数返回),并且是已知的安全风险。你为什么想要这个?
The Python方法 http://docs.python.org/release/1.4/ref/ref5.html无缝溢出到 long 是更好的方法。我相信 Perl 6 也采用了同样的行为。
您可以使用十进制模块 http://docs.python.org/library/decimal.html获得更多有限溢出:
>>> from decimal import *
>>> from sys import maxint
>>> getcontext()
Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999999, Emax=999999999, capitals=1,
flags=[], traps=[DivisionByZero, Overflow, InvalidOperation])
>>> d=Decimal(maxint)
>>> d
Decimal('9223372036854775807')
>>> e=Decimal(maxint)
>>> f=d**e
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/decimal.py", line 2225, in __pow__
ans = ans._fix(context)
File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/decimal.py", line 1589, in _fix
return context._raise_error(Overflow, 'above Emax', self._sign)
File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/decimal.py", line 3680, in _raise_error
raise error(explanation)
decimal.Overflow: above Emax
您可以使用 Decimal 类设置精度和边界条件,并且溢出几乎是立即的。您可以设置陷阱的内容。您可以设置最大值和最小值。真的——还有什么比这更好的呢? (说实话,我不知道相对速度,但我怀疑它比 numby 快,但显然比本机整数慢......)
对于您的图像处理的特定问题,这听起来像是考虑某种形式的自然应用程序饱和算术 http://en.wikipedia.org/wiki/Saturated_arithmetic。您还可以考虑,如果 32 算术发生溢出,请在明显情况下检查操作数:pow、**、*。你可能会考虑重载运算符 http://www.brpreiss.com/books/opus7/html/page596.html并检查您不想要的条件。
如果小数、饱和或重载运算符不起作用 --你可以写一个扩展 http://docs.python.org/extending/。如果你想抛弃Python的溢出方式来复古的话,天堂会帮助你的......