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);