c - long - printf() formateo para hex
printf string c (3)
El "0x" cuenta para el recuento de ocho caracteres. Necesitas "%#010x"
.
Tenga en cuenta que #
no agrega 0x a 0; el resultado será 0000000000
, por lo que probablemente solo deba usar "0x%08x"
todos modos.
Esto es más una consulta curiosa que una pregunta importante, pero ¿por qué cuando se imprime hexadecimal como un número de 8 dígitos con ceros a la izquierda, este %#08X
no muestra el mismo resultado que 0x%08X
?
Cuando trato de usar el primero, se quita el indicador de formato 08
y no funciona con solo 8
.
De nuevo, solo tenía curiosidad.
La conversión de %#08X
debe preceder al valor con 0X
; eso es requerido por el estándar. No hay evidencia en el estándar que el #
deba alterar el comportamiento de la parte 08
de la especificación, excepto que el prefijo 0X
se cuenta como parte de la longitud (por lo que es posible que desee / necesite usar %#010X
. Si, como yo, te gusta tu hex presentado como 0x1234CDEF
, entonces tienes que usar 0x%08X
para lograr el resultado deseado. Podrías usar %#.8X
y eso también debería insertar los ceros a la izquierda.
Pruebe variaciones en el siguiente código:
#include <stdio.h>
int main(void)
{
int j = 0;
printf("0x%.8X = %#08X = %#.8X = %#010x/n", j, j, j, j);
for (int i = 0; i < 8; i++)
{
j = (j << 4) | (i + 6);
printf("0x%.8X = %#08X = %#.8X = %#010x/n", j, j, j, j);
}
return(0);
}
En una máquina RHEL 5, y también en Mac OS X (10.7.5), la salida fue:
0x00000000 = 00000000 = 00000000 = 0000000000
0x00000006 = 0X000006 = 0X00000006 = 0x00000006
0x00000067 = 0X000067 = 0X00000067 = 0x00000067
0x00000678 = 0X000678 = 0X00000678 = 0x00000678
0x00006789 = 0X006789 = 0X00006789 = 0x00006789
0x0006789A = 0X06789A = 0X0006789A = 0x0006789a
0x006789AB = 0X6789AB = 0X006789AB = 0x006789ab
0x06789ABC = 0X6789ABC = 0X06789ABC = 0x06789abc
0x6789ABCD = 0X6789ABCD = 0X6789ABCD = 0x6789abcd
Estoy un poco sorprendido por el tratamiento de 0; No estoy 0X
por qué se omite el prefijo 0X
, pero con dos sistemas separados haciéndolo, debe ser estándar. Confirma mis prejuicios contra la opción #
.
El tratamiento de cero está de acuerdo con el estándar.
ISO / IEC 9899: 2011 §7.21.6.1 La función
fprintf
¶6 Los caracteres de la bandera y sus significados son:
...
#
El resultado se convierte a una "forma alternativa". ... Para la conversiónx
(oX
), un resultado distinto de cero tiene un0x
(o0X
). ...
(Énfasis añadido.)
La parte #
le da un 0x
en la cadena de salida. La 0
y la x
cuentan contra tus "8" caracteres enumerados en la parte 08
. Debe solicitar 10 caracteres si desea que sea el mismo.
int i = 7;
printf("%#010x/n", i); // gives 0x00000007
printf("0x%08x/n", i); // gives 0x00000007
printf("%#08x/n", i); // gives 0x000007
También cambiar el caso de x
afecta la envoltura de los caracteres generados.
printf("%04x", 4779); // gives 12ab
printf("%04X", 4779); // gives 12AB