Python promueve un desbordamiento de int
a una precisión arbitraria larga que está limitada solo por la memoria disponible.
Se puede ver la promoción con este código:
import struct
from sys import maxint
maximum_int = maxint
minimum_int = -maxint-1
big_minus = -maxint-(maxint*maxint)
big_plus=maxint*maxint*maxint
def platform():
return struct.calcsize("P") * 8
def bit_length(x):
s=bin(x)
s=s.lstrip('-0b')
return len(s)
print
print 'running in ', platform(), ' bit mode...'
print 'maxint: ', maximum_int, ' bits: ', bit_length(maximum_int)
print 'minint: ', minimum_int, ' bits: ', bit_length(minimum_int)
print 'a big minus: ', big_minus, ' bits: ', bit_length(big_minus)
print 'big_plus: ', big_plus, ' bits: ', bit_length(big_plus)
print
Correr bajo Python 32 bits, aquí es el retorno:
running in 32 bit mode...
maxint: 2147483647 bits: 31
minint: -2147483648 bits: 32
a big minus: -4611686016279904256 bits: 62
big_plus: 9903520300447984150353281023 bits: 93
Bajo 64 Python bits:
running in 64 bit mode...
maxint: 9223372036854775807 bits: 63
minint: -9223372036854775808 bits: 64
a big minus: -85070591730234615856620279821087277056 bits: 126
big_plus: 784637716923335095224261902710254454442933591094742482943 bits: 189
Curiosamente , en Python 2.7 en mi sistema, la promoción a una larga sucede cuando coacces maxint a un flotador. Parece que la conversión a un flotante es equivalente a maxint + 1. En mi sistema: 'int (float (sys.maxint)) == 9223372036854775808L == sys.maxint + 1' da' True'. – hobs
Para la conversión flotante o -maxint: 'int (float (-sys.maxint)) == -9223372036854775808' y' int (float (-sys.maxint)) == -sys.maxint - 1' son ambos 'True '. ¡Así que ten cuidado cuando forces maxint a un flotador! – hobs
@hobs. Esto se debe a la precisión limitada de los flotadores (~ 15 dígitos decimales). –