HOWTO · C
Imprimir un valor hexadecimal en C
Este artículo demuestra cómo imprimir un valor hexadecimal en lenguaje de programación C.
En esta página
Para imprimir un entero en hexadecimal en C, pásalo a printf con %x para obtener dígitos en minúscula o con %X para obtenerlos en mayúscula. Por ejemplo, printf("%x", 252); muestra fc.
Imprimir un entero como valor hexadecimal en C
El hexadecimal es una representación en base 16 de un entero. Usa los dígitos del 0 al 9 y las letras de la a a la f (o de la A a la F); sirve para mostrar el valor, pero no es un tipo de datos de C. Guarda el número en un tipo entero adecuado y deja que el especificador de conversión de printf determine cómo se muestra. El tipo del argumento debe coincidir con la conversión: %x y %X esperan un argumento unsigned int después de las promociones habituales de enteros.
scanf es una operación de entrada independiente. Puede leer datos hexadecimales, pero no hace falta cuando ya tienes un valor que quieres imprimir.
Elegir entre la salida hexadecimal en minúsculas o mayúsculas
Usa %x cuando quieras que las letras de los dígitos hexadecimales aparezcan en minúscula, como en fc. Usa %X para mostrarlas en mayúscula, como en FC. Ambas conversiones representan el mismo entero; solo cambia el uso de mayúsculas y minúsculas. En la cadena de formato, coloca la conversión donde quieras que aparezca el número y pasa a printf el argumento entero correspondiente.
Añadir un prefijo, definir el ancho o incluir ceros iniciales
La marca # solicita la forma alternativa: para un valor hexadecimal distinto de cero, añade 0x con %x o 0X con %X. Si el valor es cero, no añade ningún prefijo. El ancho de campo indica el ancho total mínimo de la salida e incluye el prefijo, si lo hay; por ejemplo, %10x alinea los dígitos a la derecha en un campo de al menos diez caracteres. Añade la marca 0, como en %010x, para rellenar con ceros a la izquierda cuando no se especifica una precisión.
La precisión de un entero establece un número mínimo de dígitos hexadecimales. Por ejemplo, %.8x produce al menos ocho dígitos y completa con ceros iniciales cuando es necesario. Si se especifica una precisión, se ignora la marca 0. Combinar # con un ancho o una precisión permite controlar conjuntamente el prefijo y los dígitos; por ejemplo, %#10.8x solicita la forma alternativa y al menos ocho dígitos dentro de un ancho mínimo de diez caracteres.
Convertir un entero decimal a hexadecimal
Para convertir 252 a mano, divide entre 16 y anota cada resto: 252 da como cociente 15 y como resto 12; 15 da como cociente 0 y como resto 15. Lee los restos en orden inverso. El resto 15 corresponde a f y el resto 12 a c, así que 252 es fc en hexadecimal. printf realiza esta conversión si recibe un argumento entero compatible; por tanto, la división manual sirve para entender el resultado, pero no es un paso necesario en un programa.
Compilar y ejecutar un ejemplo completo
Este programa completo en C imprime el mismo valor con letras en minúscula y en mayúscula, y después muestra el ancho, el relleno con ceros, la forma alternativa y la precisión. El ejemplo no se ha ejecutado aquí, así que no se incluye una salida observada; compílalo con un compilador de C para ver cómo se aplica el formato en tu sistema.
#include <stdio.h>
int main(void) {
unsigned int value = 252;
printf("lowercase: %x\n", value);
printf("uppercase: %X\n", value);
printf("width: [%10x]\n", value);
printf("zeroes: [%010x]\n", value);
printf("prefix: [%#x]\n", value);
printf("precision: [%.8x]\n", value);
printf("zero with alternate form: [%#x]\n", 0u);
return 0;
}