Octal a decimal en C

Octal a decimal en C

Para terminar la serie de ejercicios sobre conversiones de números entre distintas bases veremos cómo convertir un número octal a decimal usando el lenguaje de programación C.

Es exactamente el mismo algoritmo que usamos para convertir hexadecimal a decimal; únicamente cambia la base (de 16 a 8, porque octal es base 8) y la obtención de la equivalencia.

Octal a decimal en C
Octal a decimal en C

Lecturas recomendadas

Decimal a binario, octal y hexadecimal en C

Binario a decimal en C

Convertir hexadecimal a decimal en C

Algoritmo para convertir octal a decimal en C

Como lo dije, es igual que convertir hexadecimal a decimal. Ahora en lugar de elevar el 16 a la potencia según la posición, vamos a elevar el número 8.

Por otro lado, ya no necesitamos hacer una conversión tan larga; pues en octal se usan los dígitos del 0 al 7, no hay letras y por lo tanto podemos aplicar el truco de convertir un char a su representación entera.

Recorremos la cadena de derecha a izquierda y por cada carácter multiplicamos su valor por el resultado de elevar 8 a una potencia. Primero la potencia es 0, luego es 1 y así sucesivamente conforme nuestra cadena sea más larga.

Función que convierte octal a decimal en C

Aquí está el código de la función. Recibe como argumentos la cadena que representa al número octal y la longitud de la misma; devuelve un unsigned long long representando el número decimal.

/*
    Algoritmo que convierte un número octal
    a uno decimal en C
    @author parzibyte
    Visita: parzibyte.me1
*/
unsigned long long octalADecimal(char *cadenaOctal, int longitud) {
  unsigned long long decimal = 0;
  int potencia = 0;
  for (int i = longitud - 1; i >= 0; i--) {
 
    int valorActual = cadenaOctal[i] - '0';
    // Elevar 8 a la potencia que se va incrementando, y multiplicarla por el
    // valor
    unsigned long long elevado = pow(BASE, potencia) * valorActual;
 
    // Agregar al número
    decimal += elevado;
    // Avanzar en la potencia
    potencia++;
  }
  return decimal;
}

No vemos el 8 en ningún lado porque tenemos definida arriba la base con #define BASE 8. Para la equivalencia simplemente restamos ‘0’ al valor; dándonos su representación entera.

Por cierto, recuerda que aquí puedes ver cómo elevar un número a una potencia en C.

Uso de la función y ejemplo de conversión

Para implementarla podemos hacer esto:

/*
    Algoritmo que convierte un número octal
    a uno decimal en C
    @author parzibyte
    Visita: parzibyte.me
*/
#include <stdio.h>  // printf y fgets
#include <string.h> // strlen
#include <math.h>   // pow
#define LONGITUD_MAXIMA 1000
#define BASE 8
 
// Prototipos de funciones
unsigned long long octalADecimal(char *cadenaOctal, int longitud);
 
int main() {
  // Esta primera parte tiene que ver con leer la entrada del usuario,
  // únicamente para demostrar
  char octal[LONGITUD_MAXIMA];
  printf("Introduce un número octal de hasta %d caracteres:\n",
         LONGITUD_MAXIMA - 1);
  fgets(octal, LONGITUD_MAXIMA, stdin);
  octal[strcspn(octal, "\r\n")] = 0;
 
  // Ahora sí aquí convertimos
  unsigned long long decimal = octalADecimal(octal, strlen(octal));
  printf("El octal %s es %llu en decimal", octal, decimal);
  return 0;
}
 
/*
    Algoritmo que convierte un número octal
    a uno decimal en C
    @author parzibyte
    Visita: parzibyte.me1
*/
unsigned long long octalADecimal(char *cadenaOctal, int longitud) {
  unsigned long long decimal = 0;
  int potencia = 0;
  for (int i = longitud - 1; i >= 0; i--) {
 
    int valorActual = cadenaOctal[i] - '0';
    // Elevar 8 a la potencia que se va incrementando, y multiplicarla por el
    // valor
    unsigned long long elevado = pow(BASE, potencia) * valorActual;
 
    // Agregar al número
    decimal += elevado;
    // Avanzar en la potencia
    potencia++;
  }
  return decimal;
}

Recuerda que leemos con fgets para mayor seguridad. Para sacar la longitud de la cadena usamos strlen y lo demás ya está explicado.

Estoy aquí para ayudarte 🤝💻


Estoy aquí para ayudarte en todo lo que necesites. Si requieres alguna modificación en lo presentado en este post, deseas asistencia con tu tarea, proyecto o precisas desarrollar un software a medida, no dudes en contactarme. Estoy comprometido a brindarte el apoyo necesario para que logres tus objetivos. Mi correo es parzibyte(arroba)gmail.com, estoy como@parzibyte en Telegram o en mi página de contacto

No te pierdas ninguno de mis posts 🚀🔔

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.

Dejar un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *