Sie können hh
damit feststellen, printf
dass das Argument ein vorzeichenloses Zeichen ist. Verwenden Sie 0
diese Option, um einen Nullpunkt zu erhalten und 2
die Breite auf 2 x
oder X
für Hex-Zeichen in Klein- / Großbuchstaben festzulegen.
uint8_t a = 0x0a;
printf("%02hhX", a); // Prints "0A"
printf("0x%02hhx", a); // Prints "0x0a"
Bearbeiten : Wenn die Leser über die Behauptung von 2501 besorgt sind, dass dies irgendwie nicht die "richtigen" Formatspezifizierer sind, schlage ich vor, dass sie den printf
Link erneut lesen . Speziell:
Obwohl% c ein int-Argument erwartet, ist es sicher, ein Zeichen zu übergeben, da beim Aufruf einer variadischen Funktion eine Ganzzahl-Heraufstufung stattfindet.
Die korrekten Konvertierungsspezifikationen für die Zeichentypen mit fester Breite (int8_t usw.) sind im Header <cinttypes>
(C ++) oder <inttypes.h>
(C) definiert (obwohl PRIdMAX, PRIuMAX usw. gleichbedeutend mit% jd,% ju usw. sind) .
In diesem Fall spielt es keine Rolle, ob die Werte signiert oder nicht signiert sind, da die Werte immer positiv sein müssen und leicht in ein signiertes Int passen. Es gibt sowieso keinen vorzeichenbehafteten hexideximalen Formatbezeichner.
Edit 2 : (Ausgabe "Wann muss man zugeben, dass man falsch liegt?"):
Wenn Sie den aktuellen C11-Standard auf Seite 311 (329 des PDF) lesen , finden Sie:
hh: Gibt an, dass eine nachfolgende d
, i
, o
, u
, x
, oder X
Konvertierungsspezifizierer zu a gilt signed char
oder unsigned char
Argument (das Argument wird gemäß den Integer - aktionen gefördert worden, aber sein Wert wird umgewandelt werden signed char
oder unsigned char
vor dem Drucken); oder dass ein folgender n
Konvertierungsspezifizierer auf einen Zeiger auf ein signed char
Argument angewendet wird.
"\xc0\xc0abc123"