While I didn't find it in the documentation, here is my explanation.
Python 2 promotes int
to long
implicitly, when the value exceeds the value that can be stored in int. The size of the new type (long
) is the default size of long
, which is 32. From now on, the size of your variable, will be determined by its value, which can go up and down.
from sys import getsizeof as size
a = 1
n = 32
# going up
for i in range(10):
if not i:
print 'a = %100s%13s%4s' % (str(a), type(a), size(a))
else:
print 'a = %100s%14s%3s' % (str(a), type(a), size(a))
a <<= n
# going down
for i in range(11):
print 'a = %100s%14s%3s' % (str(a), type(a), size(a))
a >>= n
a = 1 <type 'int'> 24
a = 4294967296 <type 'long'> 32
a = 18446744073709551616 <type 'long'> 36
a = 79228162514264337593543950336 <type 'long'> 40
a = 340282366920938463463374607431768211456 <type 'long'> 44
a = 1461501637330902918203684832716283019655932542976 <type 'long'> 48
a = 6277101735386680763835789423207666416102355444464034512896 <type 'long'> 52
a = 26959946667150639794667015087019630673637144422540572481103610249216 <type 'long'> 56
a = 115792089237316195423570985008687907853269984665640564039457584007913129639936 <type 'long'> 60
a = 497323236409786642155382248146820840100456150797347717440463976893159497012533375533056 <type 'long'> 64
a = 2135987035920910082395021706169552114602704522356652769947041607822219725780640550022962086936576 <type 'long'> 68
a = 497323236409786642155382248146820840100456150797347717440463976893159497012533375533056 <type 'long'> 64
a = 115792089237316195423570985008687907853269984665640564039457584007913129639936 <type 'long'> 60
a = 26959946667150639794667015087019630673637144422540572481103610249216 <type 'long'> 56
a = 6277101735386680763835789423207666416102355444464034512896 <type 'long'> 52
a = 1461501637330902918203684832716283019655932542976 <type 'long'> 48
a = 340282366920938463463374607431768211456 <type 'long'> 44
a = 79228162514264337593543950336 <type 'long'> 40
a = 18446744073709551616 <type 'long'> 36
a = 4294967296 <type 'long'> 32
a = 1 <type 'long'> 28
As you can see, the type stays long
after it first became too big for an int
, and the initial size was 32, but the size changes with the value (can be higher or lower [or equal, obviously] to 32)
So, to answer your question, the base size is 24 for int
, and 28 for long
, while long
has also the space for saving large values (which starts as 4 bytes - hence 32 bytes for long
, but can go up and down according to the value)
As for your sub-question, creating a unique type (with a unique size) for a new number is impossible, so Python has "sub classes" of long
type, which deal with a range of numbers, therefore, once you over the limit of your old long
you must use the newer, which accounts for much larger numbers too, therefore, it has a few bytes more.