¡Convierte decimales y hexadecimales libremente en C! Guía completa para principiantes

目次

1. Introducción

¿Qué es el sistema numérico (base) de los valores numéricos?

En el mundo de la informática, los valores numéricos se representan en diversas bases (sistemas numéricos). El que usamos diariamente es el decimal, pero en el lenguaje C, además de este, se utilizan ampliamente el hexadecimal, binario y octal. En particular, el hexadecimal aparece frecuentemente en direcciones de memoria, operaciones de bits, sistemas embebidos y especificaciones de códigos de color. Por ejemplo, el código de color «#FFFFFF» es un valor representado en hexadecimal, que al convertirlo a decimal se obtiene «16777215». De esta manera, entender correctamente la conversión de bases es importante para manejar el lenguaje C.

Propósito de este artículo

En este artículo, explicaremos de manera clara cómo convertir de decimal a hexadecimal y de hexadecimal a decimal en el lenguaje C. Cubrimos desde los conocimientos básicos hasta códigos de muestra prácticos, por lo que incluso los principiantes pueden aplicarlo inmediatamente.

2. Cómo convertir un número decimal a hexadecimal en lenguaje C

Método usando la función printf

En lenguaje C, printf la función se puede utilizar para convertir y mostrar fácilmente un número decimal a hexadecimal.

Ejemplo básico

#include 

int main() {
    int number = 255; // número decimal
    printf("%xn", number); // hexadecimal en minúsculas
    printf("%Xn", number); // hexadecimal en mayúsculas
    return 0;
}

Explicación

  • %x: representación hexadecimal en minúsculas
  • %X: representación hexadecimal en mayúsculas
Por ejemplo, en el caso de number = 255, la salida será la siguiente.
  • %x: ff
  • %X: FF

Método para alinear el número de dígitos

Al especificar el número de dígitos en el especificador de formato, se puede mostrar el hexadecimal con un número fijo de dígitos.
#include 

int main() {
    int number = 255;
    printf("%04xn", number); // mostrar alineado en 4 dígitos
    return 0;
}
Salida: 00ff Al agregar ceros al principio, se obtiene una apariencia alineada incluso si faltan dígitos.

Método usando la función sprintf

En lugar de la printf función, al utilizar la sprintf función, se puede almacenar el resultado de la conversión como una cadena.

Ejemplo básico

#include 

int main() {
    int number = 255;
    char buffer[10];
    sprintf(buffer, "%x", number);
    printf("Hexadecimal: %sn", buffer); // salida como cadena
    return 0;
}

Explicación

En buffer se almacena la cadena hexadecimal, por lo que se puede reutilizar más tarde o pasarla a otro procesamiento. Esto permite crear programas más flexibles.

Conversión manual (utilizando operaciones de bits)

Se explica el método para convertir manualmente un número decimal a hexadecimal utilizando operaciones de bits. Esto es efectivo para profundizar en la comprensión de la conversión de bases.

Código de ejemplo

#include 
#include 

int main() {
    int number = 255;
    char hex[10];
    int i = 0;

    while (number > 0) {
        int remainder = number % 16;
        hex[i++] = (remainder < 10) ? '0' + remainder : 'A' + (remainder - 10);
        number /= 16;
    }
    hex[i] = '\0';

    // Invertir la cadena
    for (int j = 0; j < i / 2; j++) {
        char temp = hex[j];
        hex[j] = hex[i - j - 1];
        hex[i - j - 1] = temp;
    }

    printf("Hexadecimal: %sn", hex);
    return 0;
}

Explicación

  1. number % 16 calcula el resto y lo convierte en el carácter correspondiente del hexadecimal.
  2. number /= 16 actualiza el cociente para calcular el siguiente dígito.
  3. Finalmente, se invierte la cadena para obtenerla en el orden correcto.
Este código muestra la técnica básica para realizar la conversión de base manualmente.
侍エンジニア塾

3. Cómo convertir un número hexadecimal a decimal en C

Método usando la función scanf

scanf puede leer directamente el valor hexadecimal como decimal.

Ejemplo básico

#include 

int main() {
    int number;
    printf("Ingrese un número hexadecimal: ");
    scanf("%x", &number); // Recibe la entrada como hexadecimal
    printf("Decimal: %dn", number); // Muestra como decimal
    return 0;
}

Explicación

  1. Al usar el especificador de formato%x, se acepta la entrada hexadecimal.
  2. El valor ingresado se convierte a decimal y se almacena en la variablenumber.
  3. printf muestra el valor decimal usando%d.

Ejemplo de ejecución

Entrada: FF Salida: Decimal: 255

Notas

  • El valor que ingresa el usuario debe estar en formato hexadecimal (ej.: FF, 1A3).
  • Incluso si se agrega «0x» al principio, se procesa sin problemas (ej.: 0xFF).

Método usando la función strtol

strtol es una función conveniente que puede convertir una cadena a un número especificando la base.

Ejemplo básico

#include 
#include 

int main() {
    char hexString[] = "FF"; // Cadena hexadecimal
    long number = strtol(hexString, NULL, 16); // Especifica la base 16 para la conversión
    printf("Decimal: %ldn", number);
    return 0;
}

Explicación

  1. strtol: el primer argumento es la cadena a convertir (aquíhexString).
  2. El segundo argumento es un puntero que indica el final de la cadena después de la conversión; aquí se especificaNULL porque no se usa.
  3. El tercer argumento especifica la base (aquí 16) para convertir de hexadecimal a decimal.

Ejemplo de ejecución

Entrada: "FF" Salida: Decimal: 255

Cómo usar strtol con manejo de errores

Ejemplo con manejo de errores

#include 
#include 
#include 

int main() {
    char hexString[] = "ZZZ"; // Hexadecimal inválido
    char *endptr;
    errno = 0; // Inicializa el error

    long number = strtol(hexString, &endptr, 16);

    if (errno != 0 || *endptr != '\0') {
        printf("Entrada inválida.n");
    } else {
        printf("Decimal: %ldn", number);
    }

    return 0;
}

Explicación

  1. endptr apunta a la posición donde termina la conversión. Si hay caracteres no convertidos,*endptr no será'\0'.
  2. Al verificarerrno, se pueden detectar desbordamientos u otros errores.
  3. Si se detecta una entrada inválida, se muestra un mensaje de error.

Ejemplo de ejecución

Entrada: "ZZZ" Salida: Entrada inválida.

Método de conversión manual

Código de ejemplo

#include 
#include 
#include 

int main() {
    char hexString[] = "FF";
    int length = strlen(hexString);
    int decimal = 0;

    for (int i = 0; i < length; i++) {
        char digit = hexString[i];
        int value;

        if (digit >= '0' && digit <= '9') {
            value = digit - '0';
        } else if (digit >= 'A' && digit <= 'F') {
            value = digit - 'A' + 10;
        } else if (digit >= 'a' && digit <= 'f') {
            value = digit - 'a' + 10;
        } else {
            printf("Carácter inválido.n");
            return 1;
        }

        decimal += value * pow(16, length - i - 1);
    }

    printf("Decimal: %dn", decimal);
    return 0;
}

Explicación

  1. Se analiza cada carácter dígito por dígito y se convierte al valor decimal correspondiente.
  2. Se multiplica por el peso del dígito (potencia de 16) y se suma.

Ejemplo de ejecución

Entrada: "FF" Salida: Decimal: 255

4. Código de muestra práctico

Programa de conversión bidireccional

Resumen del programa

En este programa, se permite seleccionar las siguientes operaciones.
  1. Convertir decimal a hexadecimal
  2. Convertir hexadecimal a decimal

Ejemplo de código

#include 
#include 
#include 
#include 

void decimalToHexadecimal() {
    int decimal;
    printf("Ingrese un número decimal: ");
    scanf("%d", &decimal);
    printf("Hexadecimal: %Xn", decimal);
}

void hexadecimalToDecimal() {
    char hex[20];
    printf("Ingrese un número hexadecimal: ");
    scanf("%s", hex);

    // Verificación de la validez de la cadena de entrada
    for (int i = 0; i < strlen(hex); i++) {
        if (!isxdigit(hex[i])) {
            printf("Número hexadecimal inválido.n");
            return;
        }
    }

    int decimal = (int)strtol(hex, NULL, 16);
    printf("Decimal: %dn", decimal);
}

int main() {
    int choice;

    while (1) {
        printf("nSeleccione una opción de conversión:n");
        printf("1. Convertir decimal a hexadecimaln");
        printf("2. Convertir hexadecimal a decimaln");
        printf("3. Salirn");
        printf("Selección: ");
        scanf("%d", &choice);

        switch (choice) {
            case 1:
                decimalToHexadecimal();
                break;
            case 2:
                hexadecimalToDecimal();
                break;
            case 3:
                printf("Saliendo del programa.n");
                return 0;
            default:
                printf("Selección inválida. Inténtelo de nuevo.n");
        }
    }
    return 0;
}

Ejemplo de ejecución

Caso 1: Convertir decimal a hexadecimal
Seleccione una opción de conversión:
1. Convertir decimal a hexadecimal
2. Convertir hexadecimal a decimal
3. Salir
Selección: 1
Ingrese un número decimal: 255
Hexadecimal: FF
Caso 2: Convertir hexadecimal a decimal
Seleccione una opción de conversión:
1. Convertir decimal a hexadecimal
2. Convertir hexadecimal a decimal
3. Salir
Selección: 2
Ingrese un número hexadecimal: FF
Decimal: 255
Caso 3: Entrada hexadecimal inválida
Seleccione una opción de conversión:
1. Convertir decimal a hexadecimal
2. Convertir hexadecimal a decimal
3. Salir
Selección: 2
Ingrese un número hexadecimal: ZZZ
Número hexadecimal inválido.

Puntos de manejo de errores

Medidas contra entradas inválidas

  1. Verificar la validez de la entrada hexadecimal:
  • isxdigit función para verificar si cada carácter es un dígito hexadecimal válido (0-9, A-F, a-f).
  1. Manejo de errores en la entrada decimal:
  • Es posible agregar un manejo que muestre un mensaje de error si la entrada no es numérica y solicite reingreso.

Prevención de bucles infinitos

Si el programa no define claramente la condición de salida, puede ocurrir un bucle infinito. En este programa, se termina correctamente con la opción «3».

Ideas para extender el programa

Al agregar las siguientes funciones, es posible extenderlo a un programa más conveniente.
  1. Funcionalidad de conversión a binario u octal
  • Agregar un menú para seleccionar el sistema numérico.
  1. Formatear el resultado de conversión especificando el número de dígitos
  • Agregar una opción para formatear la salida con un número fijo de dígitos.
  1. Registro en archivo de log
  • Guardar los resultados de conversión como log en un archivo.

Resumen

Este programa de muestra es un ejemplo práctico que permite la conversión mutua entre decimal y hexadecimal de manera simple. Como maneja la entrada del usuario y considera el manejo de errores, incluso los principiantes pueden usarlo con confianza.

5. Notas y mejores prácticas

Precauciones sobre el uso de especificadores de formato

Salida con dígitos alineados

printf Al usar la función para salida en hexadecimal, configurando adecuadamente el especificador de formato, se puede alinear el número de dígitos o agregar ceros al principio.
#include 

int main() {
    int number = 255;
    printf("Hexadecimal de 4 dígitos: %04Xn", number); // Salida: 00FF
    return 0;
}
  • %04X: Salida de hexadecimal en mayúsculas de 4 dígitos, rellenando con 0 los insuficientes.
  • Usando este formato, se puede lograr una salida formateada y fácil de leer.

Selección de mayúsculas y minúsculas

La salida en hexadecimal puede ser en mayúsculas (%X) y minúsculas (%x). Distinguiéndolas según sea necesario, se puede lograr una salida flexible según la apariencia o el uso.

Validación de valores de entrada

Entrada en decimal

Dado que los usuarios pueden ingresar valores inválidos, agregar manejo de errores mejora la confiabilidad del programa.
#include 

int main() {
    int number;
    printf("Ingrese un número decimal: ");
    if (scanf("%d", &number) != 1) {
        printf("Entrada inválida.\n");
        return 1;
    }
    printf("Valor ingresado: %d\n", number);
    return 0;
}

Entrada en hexadecimal

Al recibir una cadena hexadecimal como entrada, es importante validar si el valor de entrada es válido.
#include 
#include 
#include 

int isValidHex(const char *hex) {
    for (int i = 0; i < strlen(hex); i++) {
        if (!isxdigit(hex[i])) {
            return 0; // Contiene caracteres inválidos
        }
    }
    return 1; // Hexadecimal válido
}

int main() {
    char hex[20];
    printf("Ingrese un hexadecimal: ");
    scanf("%s", hex);

    if (!isValidHex(hex)) {
        printf("Hexadecimal inválido.\n");
        return 1;
    }

    printf("El hexadecimal ingresado es válido.\n");
    return 0;
}

Manejo de números negativos y desbordamiento

Manejo de números negativos

Al manejar números negativos, se depende de tipos con signo (int o long). Al salir en hexadecimal un número negativo, internamente se usa la representación en complemento a dos.
#include 

int main() {
    int number = -255;
    printf("Hexadecimal (número negativo): %Xn", number); // La salida es la representación en complemento a dos
    return 0;
}

Evitar desbordamiento

Al manejar valores grandes, es necesario tener cuidado de no exceder el límite del tipo. En C, se puede confirmar el rango del tipo con el siguiente encabezado.
#include 
#include 

int main() {
    printf("Valor máximo de int: %d\n", INT_MAX);
    printf("Valor mínimo de int: %d\n", INT_MIN);
    return 0;
}
Al seleccionar el tipo apropiado, se puede reducir el riesgo de desbordamiento. Por ejemplo, para valores muy grandes, se recomienda usar el tipo long long.

Mejoras en legibilidad y mantenibilidad

Comentarios y reglas de nomenclatura

  • Al asignar nombres significativos a funciones y variables, y agregar comentarios apropiadamente, se mejora la legibilidad del código.

Aprovechamiento de funciones estándar

  • La conversión manual de bases es efectiva para fines de aprendizaje, pero en la práctica, priorizar el uso de funciones estándar (printf o strtol, etc.) mejora la mantenibilidad del código.

Pruebas del programa

Importancia de los casos de prueba

Al crear un programa de conversión de bases, es importante probar casos como los siguientes.
  • Entrada normal (ej: decimal 255 → hexadecimal FF)
  • Entrada inválida (ej: cadena ABC como decimal)
  • Valores límite (ej: máximo INT_MAX, mínimo INT_MIN)
  • Entrada de números negativos o cero
Al realizar pruebas, se puede aumentar la confiabilidad del programa.

6. Preguntas frecuentes (FAQ)

¿Cómo agregar «0x» al principio de la salida en hexadecimal con la función printf?

Respuesta:

Para agregar «0x» al principio, añada explícitamente «0x» como cadena antes del especificador de formato.

Ejemplo de código:

#include 

int main() {
    int number = 255;
    printf("Hexadecimal (con 0x): 0x%Xn", number); // Salida: 0xFF
    return 0;
}

Nota:

«0x» es un prefijo estándar que indica hexadecimal. Por ejemplo, se usa comúnmente al manejar códigos de color o direcciones de memoria.

¿Qué sucede al intentar convertir una cadena inválida con la función strtol?

Respuesta:

strtolLa función no lanza un error incluso si la cadena es inválida; en su lugar, convierte solo la parte posible. Cuando aparece un carácter que no se puede convertir, ignora el resto de la cadena.

Ejemplo de código:

#include 
#include 

int main() {
    char hexString[] = "FFG12";
    char *endptr;
    long number = strtol(hexString, &endptr, 16);

    printf("Valor convertido: %ldn", number);
    printf("Parte no convertible: %sn", endptr); // Salida: G12
    return 0;
}

Ejemplo de salida:

Valor convertido: 255
Parte no convertible: G12

¿Cómo convertir un número decimal a hexadecimal sin usar la función printf?

Respuesta:

Se puede convertir manualmente utilizando operaciones de bits. Este método ayuda a entender la lógica interna de la conversión de bases.

Ejemplo de código:

#include 

void decimalToHex(int decimal) {
    char hex[20];
    int index = 0;

    while (decimal > 0) {
        int remainder = decimal % 16;
        hex[index++] = (remainder < 10) ? '0' + remainder : 'A' + (remainder - 10);
        decimal /= 16;
    }

    printf("Hexadecimal: ");
    for (int i = index - 1; i >= 0; i--) {
        printf("%c", hex[i]);
    }
    printf("n");
}

int main() {
    int number = 255;
    decimalToHex(number);
    return 0;
}

¿Cómo limitar el número de dígitos al recibir entrada con la función scanf?

Respuesta:

scanfAl especificar el número de dígitos en el especificador de formato de la función, se puede limitar el número de caracteres de entrada.

Ejemplo de código:

#include 

int main() {
    char hex[5]; // Para recibir un máximo de 4 dígitos de entrada
    printf("Ingrese un hexadecimal de máximo 4 dígitos: ");
    scanf("%4s", hex);
    printf("Valor ingresado: %sn", hex);
    return 0;
}

Nota:

El especificador de formato%4s está configurado para aceptar una cadena de hasta 4 caracteres como entrada.

¿Cómo convertir a otras bases (por ejemplo, binaria u octal)?

Respuesta:

printfAl usar la función, también es posible convertir a otras bases. Utilice el especificador de formato o lógica adecuada según la base.

Ejemplo de código: Conversión a binario

#include 

void decimalToBinary(int decimal) {
    char binary[32];
    int index = 0;

    while (decimal > 0) {
        binary[index++] = (decimal % 2) + '0';
        decimal /= 2;
    }

    printf("Binario: ");
    for (int i = index - 1; i >= 0; i--) {
        printf("%c", binary[i]);
    }
    printf("n");
}

int main() {
    int number = 255;
    decimalToBinary(number);
    return 0;
}

¿Cómo convertir un hexadecimal en mayúsculas a minúsculas?

Respuesta:

Al usar la funcióntolower incluida en la biblioteca estándar de C, se puede convertir un hexadecimal en mayúsculas a minúsculas.

Ejemplo de código:

#include 
#include 
#include 

void toLowercase(char *hex) {
    for (int i = 0; i < strlen(hex); i++) {
        hex[i] = tolower(hex[i]);
    }
}

int main() {
    char hex[] = "FF";
    toLowercase(hex);
    printf("Hexadecimal en minúsculas: %sn", hex);
    return 0;
}

Ejemplo de salida:

Hexadecimal en minúsculas: ff

¿Cómo generar una salida en formato hexadecimal con relleno de ceros?

Respuesta:

printfAl especificar el número de dígitos en el especificador de formato de la función, se puede generar una salida en formato con relleno de ceros.

Ejemplo de código:

#include 

int main() {
    int number = 15;
    printf("Hexadecimal de 4 dígitos con relleno de ceros: %04Xn", number); // Salida: 000F
    return 0;
}

7. Resumen

En este artículo, hemos explicado de manera integral la conversión mutua entre números decimales y hexadecimales utilizando el lenguaje C, desde los fundamentos hasta código de muestra práctico, puntos de atención y FAQ. A continuación, repasamos los puntos importantes.

Puntos del artículo

Conceptos básicos de bases numéricas (sistemas numéricos)

  • El sistema decimal es la representación numérica que usamos habitualmente, mientras que el hexadecimal se utiliza comúnmente en usos específicos (por ejemplo: direcciones de memoria o códigos de color).
  • En C, se proporcionan métodos flexibles para manejar números en diversas bases.

Conversión de decimal a hexadecimal

  • printf o sprintf mediante funciones, es posible realizar la conversión de manera simple y eficiente.
  • También introdujimos un método de conversión manual utilizando operaciones de bits. Esto es útil para entender la lógica de la conversión de bases.

Conversión de hexadecimal a decimal

  • scanf o strtol mediante funciones, es posible convertir números hexadecimales en formato de cadena a decimales.
  • Incluyendo el manejo de entradas inválidas y procesamiento de errores, es posible crear programas más robustos.

Ejemplos de programas prácticos

  • A través de un programa de conversión bidireccional, procesamos entradas de usuario y realizamos la conversión mutua entre decimal y hexadecimal.
  • Explicamos cómo manejar entradas erróneas incorporando el manejo de errores.

Puntos de atención y mejores prácticas

  • Explicamos métodos para utilizar especificadores de formato y seleccionar notación en mayúsculas o minúsculas, entre otros, para mejorar la apariencia de la salida.
  • Mostramos la importancia de prestar atención a números negativos y desbordamientos, y de verificar exhaustivamente la selección de tipos y rangos.

Preguntas frecuentes (FAQ)

  • Explicamos dudas prácticas (por ejemplo: cómo agregar «0x» con printf, métodos para procesar entradas inválidas) utilizando ejemplos concretos.
  • También mencionamos métodos de aplicación a otras bases (binario u octal).

Lo que se puede aprender a través del artículo

Al leer este artículo, los lectores podrán aprender y aplicar lo siguiente.
  1. Conceptos básicos y aplicaciones de la conversión de bases en C
  2. Implementación de conversión de bases utilizando código ejecutable
  3. Creación de programas robustos que incluyen validación de entradas y manejo de errores

Para el aprendizaje futuro

Para profundizar en el entendimiento, se recomienda aprender lo siguiente.
  • Métodos de conversión a otras bases (binario u octal)
  • Implementación de conversión de bases en lenguajes de programación distintos a C
  • Conocimientos relacionados con la gestión de memoria y operaciones binarias
Esperamos que el contenido de este artículo sirva como una guía práctica y útil para principiantes en C o programadores que manejen conversiones de bases. Úsalo como referencia y desafíate a crear programas más avanzados.