Sie können hhdamit feststellen, printfdass das Argument ein vorzeichenloses Zeichen ist. Verwenden Sie 0diese Option, um einen Nullpunkt zu erhalten und 2die Breite auf 2 xoder Xfü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 printfLink 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 XKonvertierungsspezifizierer zu a gilt signed charoder unsigned charArgument (das Argument wird gemäß den Integer - aktionen gefördert worden, aber sein Wert wird umgewandelt werden signed charoder unsigned charvor dem Drucken); oder dass ein folgender nKonvertierungsspezifizierer auf einen Zeiger auf ein signed charArgument angewendet wird.
"\xc0\xc0abc123"