En este post de programación en ANSI C te mostraré 3 conversiones entre bases numéricas: de decimal a binario, a octal y a hexadecimal. La diferencia con mis otros posts es que en este caso vamos a convertir también la parte fraccionaria, decimal o como le llames a lo que va después del punto decimal.
Entonces vamos a convertir entre binario y decimal con punto decimal, además de convertir a octal, hexadecimal y a todas las otras bases.
Así que al final, con el código que te mostraré, podrás convertir números en base 10 con parte fraccionaria a cualquier base. Por ejemplo, convertir 3722.24
base 10 a E8A.3D70
base 16.
Te repito que la principal diferencia es que ahora este conversor en C soporta conversiones con punto decimal, cosa que me habían solicitado varios usuarios en mis otros posts.
Explicación del algoritmo
Para entender cómo funciona este algoritmo debemos entender la forma manual de hacer la conversión. Para este ejemplo convertiré el número a hexadecimal (pero esto que te muestro igual funciona con base 2 y base 8), así que tenemos 3722.24
como entrada.
Presta atención en que la base es 16, y los dígitos de la misma son 0123456789ABCDEF
.
Lo primero que hacemos es separar la parte entera y la parte fraccionaria, para ello podemos usar modf. Ahora trabajamos con las partes por separado.
Parte entera
En el caso de la parte entera vamos dividiendo entre 16 y obteniendo el residuo de la división. Cada valor de residuo irá conformando la cadena hexadecimal. El proceso va así:
Y hasta este momento tenemos la parte entera ya en hexadecimal que equivale a E8A
. Fíjate en que el proceso se detiene cuando la parte entera es 0.
Parte fraccionaria
En este caso vamos a multiplicar la parte fraccionaria por 16 y tomar el valor entero del resultado para agregarlo al final de la cadena hexadecimal.
Ahora la parte fraccionaria igualmente se toma del resultado anterior, y se repite el proceso hasta que el sobrante sea 0. El proceso es así:
Y la parte fraccionaria como hexadecimal es 3D70
. Por lo que el número completo ya convertido es: E8A.3D70
.
Esto mismo que aplicamos aquí se va a aplicar para la conversión de decimal a octal y decimal a binario con parte fraccionaria, solo vamos a cambiar la base y los dígitos que la conforman.
Función general para la conversión
Anteriormente había creado una función para cada conversión, pero me di cuenta de que se puede crear una función que proporciona un método de conversión desde decimal a cualquier otra base.
Sin más preámbulo, te la muestro. En los comentarios se explica el funcionamiento:
Los métodos que no son para el cálculo son para trabajar con cadenas o para invertirlas.
En este caso esta función soporta conversión de números con fracción desde la base 10 a binario, octal y hexadecimal. No devuelve nada, pues coloca el resultado en la cadena que se proporciona al llamarla. Ahora es momento de ver su modo de uso.
Antes que nada debemos declarar el número que se va a convertir y la cadena en donde se almacenará el resultado de la conversión:
Obviamente el número puede venir de cualquier lugar o puedes declararlo tú mismo.
Decimal a hexadecimal
Comenzando con el caso del ejemplo, para hacer la conversión invocamos a la función que la base es 16 con los dígitos adecuados:
Decimal a octal
Lo mismo que anteriormente, solo que ahora los dígitos van del 0 al 7 y la base es 8:
Decimal a binario
Para terminar el ejemplo, también podemos convertir de decimal a binario:
De hecho con esta función podemos convertir a cualquier otra base siempre y cuando indiquemos los dígitos.
Poniendo todo junto

Es momento de ver el código en lenguaje C completo, así como el método main
. Todo queda así:
Nota: he probado con otras calculadoras y en ocasiones el método presentado aquí no es tan preciso para la parte fraccionaria. Esto es porque me basé en el método manual para la conversión. Recuerda que igualmente eres libre de mejorar el código.
Te dejo más entradas sobre C en mi blog.