La %#08X
conversione deve precedere il valore con 0X
; quello è richiesto dalla norma. Non ci sono prove nello standard che ciò #
dovrebbe alterare il comportamento della 08
parte della specifica, tranne per il fatto che il 0X
prefisso viene conteggiato come parte della lunghezza (quindi potresti volerlo / usarlo %#010X
. Se, come me, ti piace il tuo esagono presentato come 0x1234CDEF
, quindi è necessario utilizzare 0x%08X
per ottenere il risultato desiderato. È possibile utilizzare %#.8X
e che dovrebbe anche inserire gli zero iniziali.
Prova le variazioni sul seguente codice:
#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);
}
Su un computer RHEL 5 e anche su Mac OS X (10.7.5), l'output era:
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
Sono un po 'sorpreso dal trattamento di 0; Non sono chiaro il motivo per cui il 0X
prefisso viene omesso, ma con due sistemi separati che lo fanno, deve essere standard. Conferma i miei pregiudizi contro l' #
opzione.
Il trattamento di zero è secondo lo standard.
¶6 I caratteri della bandiera e il loro significato sono:
...
#
Il risultato viene convertito in una "forma alternativa". ... Per x
(o X
) la conversione, un risultato diverso da zero ha 0x
(o 0X
) preceduto. ...
(Enfasi aggiunta.)
Si noti che l'utilizzo %#X
utilizzerà lettere maiuscole per le cifre esadecimali e 0X
come prefisso; usando %#x
utilizzerà lettere minuscole per le cifre esadecimali e 0x
come prefisso. Se si preferisce 0x
, come le lettere di prefisso e minuscole, è necessario il codice 0x
a parte: 0x%X
. Altri modificatori di formato possono essere aggiunti, se necessario, ovviamente.
Per stampare gli indirizzi, utilizzare l' <inttypes.h>
intestazione, il uintptr_t
tipo e la PRIXPTR
macro di formato:
#include <inttypes.h>
#include <stdio.h>
int main(void)
{
void *address = &address; // &address has type void ** but it converts to void *
printf("Address 0x%.12" PRIXPTR "\n", (uintptr_t)address);
return 0;
}
Esempio di output:
Address 0x7FFEE5B29428
Scegli il tuo veleno sulla lunghezza: trovo che una precisione di 12 funzioni bene per gli indirizzi su un Mac che esegue macOS. In combinazione con il .
per specificare la precisione minima (cifre), formatta gli indirizzi in modo affidabile. Se imposti la precisione su 16, le 4 cifre extra sono sempre 0 nella mia esperienza sul Mac, ma c'è sicuramente un caso da fare per usare 16 invece di 12 nel codice portatile a 64 bit (ma useresti 8 per Codice a 32 bit).
0x%.8X
? Quello sarà il piombo-riempimento con zeri. (0x
è solo un preambolo, ma probabilmente lo sai già).