Hay lenguajes de programación que de forma nativa permiten trabajar con números enteros grandes.
El lenguaje Python, así como el Mathematica, permiten trabajar de esa manera,
tal que los números enteros tienen (supuestamente) precisión tan grande como uno requiera,
aunque de forma algo lenta a la hora de usarlos en los cálculos.
No obstante, son convenientes para llevar a cabo prácticas de manera entendible, por ser lenguajes de alto nivel.
Con JavaScript también es posible trabajar con enteros de precisición arbitraria
con el tipo de datos nativo BigInt.
En las últimas versiones del lenguaje C aparecen tipos de datos enteros de precisición exacta,
en la forma _BitInt(N), donde N es una expresión constante entera que denota la cantidad de bits del número entero,
aunque con un valor máximo que depende del compilador.
Por ejemplo, el compilador de Intel permite unos 8 millones de bits.
En este caso, cada variable que definas con un tipo de datos _BitInt(N) tendrá una cantidad fija N de bits
a lo largo de todo el programa, por lo cual podrías usarlo si de antemano sabés que tus datos tendrán un tamaño fijo.
Si se requiere datos sin signo, hay que anteponer unsigned, como siempre.
Se habilitan con las opciones de compilación std=c2x o bien c23, etc., según el compilador que uses.
Este tipo de datos permite los cálculos aritméticos usuales, pero.........
tienen el problema de que no hay una manera estándar de imprimir sus valores, por ejemplo con printf().
Lo adecuado aquí sería hacer un type-punning contra un array de bytes
e imprimir los dígitos hexadecimales que se obtengan tras leer tal array.