texto numero mensaje imprimir hexadecimal datos como c++ c printf

c++ - numero - ¿Por qué printf no imprime solo un byte al imprimir hexadecimal?



imprimir un mensaje en c (5)

El especificador de ancho en printf es realmente min-width. Puede imprimirf printf(" 0x%2x ", pixel_data[0] & 0xff) para imprimir lowes byte (observe 2, para realmente imprimir dos caracteres si pixel_data[0] es por ej. 0xffffff02 ).

pixel_data es un vector de char .

Cuando printf(" 0x%1x ", pixel_data[0] ) espero ver 0xf5 .

Pero obtengo 0xfffffff5 como si estuviera imprimiendo un entero de 4 bytes en lugar de 1 byte.

¿Por qué es esto? Le he dado a printf un char para imprimir, solo tiene 1 byte, entonces, ¿por qué imprime printf 4?

NÓTESE BIEN. la implementación de printf está dentro de una API de terceros, pero me pregunto si esta es una característica de printf estándar.


Entonces el modificador de length es la longitud mínima.


Mejor uso de las banderas de formato estándar

printf(" %#1x ", pixel_data[0] );

entonces tu compilador te pone el prefijo hexadecimal.


Probablemente esté obteniendo una forma benigna de comportamiento indefinido porque el modificador %x espera un parámetro unsigned int y un char lo general se promoverá a un int cuando se pase a una función varargs .

Debería lanzar explícitamente el carácter char a unsigned int para obtener resultados predecibles:

printf(" 0x%1x ", (unsigned)pixel_data[0] );

Tenga en cuenta que un ancho de campo de uno no es muy útil. Simplemente especifica el número mínimo de dígitos para mostrar y, en cualquier caso, se necesitará al menos un dígito.

Si el char de su plataforma está firmado, esta conversión convertirá los valores de caracteres negativos en grandes valores unsigned int (por ejemplo, fffffff5 ). Si desea tratar los valores de byte como valores sin firmar y simplemente extender cero al convertir a unsigned int debe usar unsigned char para pixel_data , o pixel_data con unsigned char o usar una operación de enmascaramiento después de la promoción.

p.ej

printf(" 0x%x ", (unsigned)(unsigned char)pixel_data[0] );

o

printf(" 0x%x ", (unsigned)pixel_data[0] & 0xffU );


Use %hhx

printf("%#04hhx ", foo);