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 %#08X
no muestra el mismo resultado que 0x%08X
?
Cuando trato de usar el primero, 08
se elimina el indicador de formato y no funciona solo 8
.
De nuevo solo tenía curiosidad.
0x%.8X
? Eso se llenará con ceros. (el0x
es solo un preámbulo, pero es probable que ya lo sepas).Respuestas:
La
#
parte le da un0x
en la cadena de salida. El0
y elx
recuento en contra de sus "8" personajes enumerados en la08
parte. 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 el0x
prefijo.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
%#08X
conversió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 la08
parte de la especificación, excepto que el0X
prefijo 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%08X
para lograr el resultado deseado. Puede usar%#.8X
y 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é
0X
se 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
%#X
usará letras mayúsculas para los dígitos hexadecimales y0X
como prefijo; usar%#x
usará letras minúsculas para los dígitos hexadecimales y0x
como prefijo. Si prefiere0x
como las letras del prefijo y mayúsculas, que tiene que el código0x
por 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_t
tipo y laPRIXPTR
macro 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