Talvez já tenha acontecido com você, somar dois números inteiros positivos e o resultado ficar negativo. Você sabe por que isso acontece?
Por padrão, na maioria das arquiteturas modernas uma variável do tipo int ocupa 4 bytes de memória, ou seja, 32 bits (4 * 8 = 32).
Assim, imagine o numero 2147483647.
Este número pode ser armazenado em uma variável do tipo int em uma arquitetura onde um int possui 4 byts.
Traduzindo esse número para binário, temos:
1111111111111111111111111111111
Se você contar, verá que temos uma sequência de 31 dígitos 1.
Talvez você imagina que ainda esteja sobrando 1 dos 32 bits de memória, mas não, não está sobrando.
Quando um número é armazenado na memória, o bit mais significativo (à esquerda) é utilizado para armazenar o sinal do número (0 para positivo e 1 para negativo). Assim, o número 2147483647 é armazeno dessa forma:
01111111111111111111111111111111
Assim, voltando ao nosso número de exemplo, se efetuarmos a seguinte soma:
2147483647 + 1
teremos como resultado: -2147483648
O número 2147483648 em binário é:
10000000000000000000000000000000
Perceba que precisamos dos 32 bits para representar o resultado da soma, sendo necessário um 33º bit para armazenar o sinal.
Aqui ocorre o que chamamos de estouro de memória, ou seja, o resultado gerado é um número que não cabe na memória utilizada para armazenar um número inteiro.