Die %#08X
Konvertierung muss vor dem Wert mit erfolgen 0X
. das ist vom Standard gefordert. Der Standard enthält keine Hinweise darauf, dass das #
Verhalten des 08
Teils der Spezifikation geändert werden sollte, außer dass das 0X
Präfix als Teil der Länge gezählt wird (daher möchten / müssen Sie es möglicherweise verwenden %#010X
. Wenn Sie wie ich Ihr Hex mögen, das als dargestellt wird 0x1234CDEF
, dann müssen Sie verwenden 0x%08X
, um das gewünschte Ergebnis zu erzielen. Sie könnten verwenden, %#.8X
und das sollte auch die führenden Nullen einfügen.
Probieren Sie Variationen des folgenden Codes aus:
#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);
}
Auf einem RHEL 5-Computer und auch unter Mac OS X (10.7.5) war die Ausgabe:
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
Ich bin ein wenig überrascht über die Behandlung von 0; Ich bin mir nicht 0X
sicher , warum das Präfix weggelassen wird, aber bei zwei separaten Systemen muss es Standard sein. Es bestätigt meine Vorurteile gegen die #
Option.
Die Behandlung von Null entspricht dem Standard.
¶6 Die Flaggenzeichen und ihre Bedeutung sind:
...
#
Das Ergebnis wird in eine "alternative Form" konvertiert. ... Für die x
(oder X
) Konvertierung wird ein Ergebnis ungleich Null0x
(oder 0X
) vorangestellt. ...
(Betonung hinzugefügt.)
Beachten Sie, dass bei %#X
Verwendung Großbuchstaben für die hexadezimalen Ziffern und 0X
als Präfix verwendet werden. Bei Verwendung von %#x
werden Kleinbuchstaben für die hexadezimalen Ziffern und 0x
als Präfix verwendet. Wenn Sie 0x
Präfix und Großbuchstaben bevorzugen , müssen Sie diese 0x
separat codieren : 0x%X
. Natürlich können bei Bedarf auch andere Formatmodifikatoren hinzugefügt werden.
Verwenden Sie zum Drucken von Adressen die <inttypes.h>
Kopfzeile sowie den uintptr_t
Typ und das PRIXPTR
Formatmakro:
#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;
}
Beispielausgabe:
Address 0x7FFEE5B29428
Wählen Sie Ihr Gift auf der Länge - ich finde, dass eine Genauigkeit von 12 gut für Adressen auf einem Mac funktioniert, auf dem macOS ausgeführt wird. In Kombination mit der .
Angabe der Mindestgenauigkeit (Ziffern) werden Adressen zuverlässig formatiert. Wenn Sie die Genauigkeit auf 16 einstellen, sind die zusätzlichen 4 Ziffern meiner Erfahrung nach auf dem Mac immer 0, aber es gibt sicherlich einen Grund, 16 anstelle von 12 in tragbarem 64-Bit-Code zu verwenden (aber Sie würden 8 für verwenden 32-Bit-Code).
0x%.8X
? Das wird mit Nullen gefüllt. (Das0x
ist nur eine Präambel, aber das wissen Sie wahrscheinlich schon).