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, esto %#08Xno muestra el mismo resultado que 0x%08X?
Cuando trato de usar el primero, 08se elimina el indicador de formato y no funciona solo 8.
De nuevo solo tenía curiosidad.

0x%.8X? Eso se llenará con ceros. (el0xes solo un preámbulo, pero es probable que ya lo sepas).Respuestas:
La
#parte le da un0xen la cadena de salida. El0y elxrecuento en contra de sus "8" personajes enumerados en la08parte. Necesitas pedir 10 caracteres si quieres que sea el mismo.También cambiar el caso de
x, afecta a la carcasa de los caracteres de salida.fuente
14F?i = 0;las versiones que usan%#no incluirán el0xprefijo.El "0x" cuenta para el recuento de ocho caracteres. Es necesario
"%#010x".Tenga en cuenta que
#no no anexar el 0x a 0 - el resultado será0000000000- por lo que es probable que en realidad sólo debe utilizar"0x%08x"de todos modos.fuente
La
%#08Xconversión debe preceder al valor con0X; eso es requerido por el estándar. No hay evidencia en el estándar de que#deba alterar el comportamiento de la08parte de la especificación, excepto que el0Xprefijo se cuenta como parte de la longitud (por lo que es posible que desee / necesite usarlo%#010X. Si, como yo, le gusta su hexadecimal presentado como0x1234CDEF, entonces debe usar0x%08Xpara lograr el resultado deseado. Puede usar%#.8Xy eso también debe insertar los ceros iniciales.Pruebe variaciones en el siguiente código:
En una máquina RHEL 5, y también en Mac OS X (10.7.5), el resultado fue:
Estoy un poco sorprendido por el tratamiento de 0; No estoy claro por qué
0Xse omite el prefijo, pero con dos sistemas separados que lo hacen, debe ser estándar. Confirma mis prejuicios contra la#opción.El tratamiento de cero es de acuerdo con el estándar.
(Énfasis añadido.)
Tenga en cuenta que usar
%#Xusará letras mayúsculas para los dígitos hexadecimales y0Xcomo prefijo; usar%#xusará letras minúsculas para los dígitos hexadecimales y0xcomo prefijo. Si prefiere0xcomo las letras del prefijo y mayúsculas, que tiene que el código0xpor separado:0x%X. Se pueden agregar otros modificadores de formato según sea necesario, por supuesto.Para imprimir direcciones, use el
<inttypes.h>encabezado y eluintptr_ttipo y laPRIXPTRmacro de formato:Salida de ejemplo:
Elija su veneno en la longitud: encuentro que una precisión de 12 funciona bien para direcciones en una Mac con macOS. Combinado con
.para especificar la precisión mínima (dígitos), formatea direcciones de manera confiable. Si establece la precisión en 16, los 4 dígitos adicionales son siempre 0 en mi experiencia en la Mac, pero ciertamente hay un caso para usar 16 en lugar de 12 en código portátil de 64 bits (pero usaría 8 para Código de 32 bits).fuente