# How wide are the underlying data types for Python integers

I got asked this question just before:

Hey you know using the int() function I python, do you know how it decides what kind of int it picks? As in int32 or int64

So the interesting part about Python is that all integer objects since Python3 are arbitrary precision long integers. In Python 2 you had a distinction between fixed width integers `int`

and arbitrary precision integers `long`

.

```
$ python2
Python 2.7.17 (default, Feb 27 2021, 15:10:58)
[GCC 7.5.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> type(2**8)
<type 'int'>
>>> type(2**100)
<type 'long'>
>>>
$ python3
Python 3.7.4 (default, Aug 13 2019, 20:35:49)
[GCC 7.3.0] :: Anaconda, Inc. on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> type(2**8)
<class 'int'>
>>> type(2**100)
<class 'int'>
```

As you can see in Python3 from the perspective of the programming logic *in pure python* code you don't have to worry about how many bits are contained in an integer. However the sizes of these will vary:

```
>>> import sys
>>> sys.getsizeof(2**8)
28
>>> sys.getsizeof(2**100)
40
>>> sys.getsizeof(2**1000)
160
```

If you are working with something like Pandas or some other low level array library that deals with data of fixed widths you'd want to know what the underlying integer widths were when optimizing your data structures. On my machine `2**100`

might not fit in a fixed width integer type whereas `2**8`

likely would. There's a convenient way to get this information out:

```
>>> import sys
>>> sys.int_info
sys.int_info(bits_per_digit=30, sizeof_digit=4)
```

As you can see on this version of Python the integers are 4 bytes in the underlying `C`

type as per `sizeof_digit`

. The bits available per digit before it switches over to the arbitrary length integers is 30 bits. Note that this is less than the 32 bits.

There's a similar information for floats in `sys.float_info`