print long hexadecimal float c printf hex

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ón x (o X ), un resultado distinto de cero tiene un 0x (o 0X ). ...

(É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