Programacion

Cómo manejar números grandes

Una duda que nos plantearon hace algún tiempo, es la problemática de operar con números grandes en C, aunque este acercamiento también es válido para otros lenguajes. Lo primero de todo decir que cuando hablamos de números grandes debemos definir el número de cifras con las que consideramos que el número es grande.

Conociendo el número más grande que podemos almacenar en un tipo de dato

Un modo bastante simple, para acercarnos a este problema es ver cual es el mayor número que podemos almacenar en un tipo de dato. Aquí hay que hacer distinciones, por una parte si hablamos de números reales y por otra si hablamos de números enteros.

En el caso de números enteros, por ejemplo si nuestro tipo de dato es un entero de 32bits, y acepta números tanto positivos como negativos, el mayor número que puede almacenar es: 2^31 -1 = 2.147.483.647. Si queremos almacenar números más grandes, y no vamos a utilizar los negativos, podemos usar un entero de 32bits sin signo. En este caso tenemos que el mayor número es el 2^32 -1 = 4.294.967.295

El siguiente paso para poder manejar números más grandes, es bastante obvio y consiste en aprovechar las máquinas de 64bits, utilizando enteros de 64bits. Pudiendo almacenar como máximo el número 18.446.744.073.709.551.615.

Los tipos de datos reales, utilizan otra representación que podéis ver aquí.

Cómo manejar números todavía más grandes

En algunos casos, como en las aplicaciones que utilizan algoritmos de criptografía, se necesita utilizar números extremadamente grandes. En estos casos encontramos dos soluciones:

  • Utilizar números reales para guardar números enteros, si la precisión no es importante para nosotros.
  • Utilizar “Enteros Grandes”, para no perder precisión.

Los Enteros Grandes son un tipo de datos, que no pertenecen a los tipos de datos del lenguaje, pero los podemos encontrar en muchas librerías (principalmente en las de criptografía), estos enteros grandes nos permiten utilizar enteros que ocupan cientos de bits, por ejemplo enteros de 2048 bits para generar certificados. Como os podéis imaginar las operaciones se han tenido que programar de manera distinta, para por un lado agilizar los cálculos y por otro no desbordar los registros y/o buffers del sistema.

En el caso de que uséis C, podéis utilizar la implementación de OpenSSL.

En el caso de que uséis Java, podéis utilizar la clase BigInteger, que en este caso sí pertenece al JDK.

Espero que este artículo os haya gustado. Saludos.

Jorge Durán

Entusiasta de la tecnología desde los 10 años, desarrollador y creador de varios proyectos de software y autodidacta por naturaleza. Ingeniero Informático por la USAL y .Net backend developer en idealista.

Share
Publicado por
Jorge Durán

Recent Posts

Docker: conceptos principales y tutorial paso a paso

Hoy queremos hablaros de Docker un proyecto que cada día es más usado, porque permite…

3 años hace

Crea diagramas rápidamente usando código

Cada vez estamos más acostumbrados a usar código para generar la infraestructura (IaC), documentar nuestro…

3 años hace

Procesamiento del lenguaje natural con ElasticSearch

Uno de los problemas que se presentan con una mayor frecuencia hoy en día, es…

4 años hace

Elige tecnología clásica y aburrida

Uno de los problemas que solemos tener los programadores, es que nos gusta estar a…

4 años hace

Cómo usar Docker en Windows

Docker es una de las herramientas más usadas por los desarrolladores, sin embargo, usarlo en…

4 años hace

Analiza el coste del uso de JavaScript

Como seguramente sabrás el uso de JavaScript ha crecido exponencialmente en los últimos tiempos, sin…

5 años hace