Bem, isso foi e é assunto para milhares de livros, seminários, papéis da área da computação, e algumas dezenas de bibliotecas de aritmética de precisão arbitrária.
O básico de tudo é o seguinte: byte, int e long são tipos de dados para números com sinal, eles podem guardar até 8, 32 e 64 bits neles, onde no caso do long, vai de -1* (2^63 -1) até 2^63.
Como não dá para colocar 64 bits dentro de um registro de uma máquina 32 bit, o Java usa 2 registros de 32 para simular um de 64, e assim quando um número ultrapassa o valor máximo do primeiro registro de 32 bits(byte de baixa ordem), o valor é transbordado (overflow) para o outro registro(byte de alta ordem).
O trabalho que vai ter é fazer a mesma coisa, se você tiver um array de int de 4 posições, você terá 4*32 bits para usar, o que dá uma precisão de 128 bits. Quando algum valor transbordar um byte de baixa ordem, você terá que colocar o que foi transbordado no byte de alta ordem imediatamente próximo à ele, isso até ter um valor que ocupe as 4 posições do array.
Se der overflow na 4ª posição, terá que criar um novo array maior que 4, copiar o conteúdo do array antigo para o novo, e colocar o overflow na 5ª posição.