Anda bisa menggunakan hhuntuk memberitahu printfbahwa argumennya adalah unsigned char. Gunakan 0untuk mendapatkan bantalan nol dan 2untuk mengatur lebar ke 2. xatau Xuntuk karakter hex huruf besar / kecil.
uint8_t a = 0x0a;
printf("%02hhX", a); // Prints "0A"
printf("0x%02hhx", a); // Prints "0x0a"
Sunting : Jika pembaca prihatin tentang pernyataan 2501 bahwa ini bukan penentu format yang 'benar', saya sarankan mereka membaca printftautan itu lagi. Secara khusus:
Meskipun% c mengharapkan argumen int, aman untuk meneruskan karakter karena promosi integer yang terjadi saat fungsi variadic dipanggil.
Spesifikasi konversi yang benar untuk tipe karakter lebar tetap (int8_t, dll) ditentukan di header <cinttypes>(C ++) atau <inttypes.h>(C) (meskipun PRIdMAX, PRIuMAX, dll sama dengan% jd,% ju, dll) .
Adapun maksudnya tentang signed vs unsigned, dalam hal ini tidak masalah karena nilainya harus selalu positif dan mudah sesuai dengan int yang ditandatangani. Tidak ada penentu format heksideximal bertanda.
Edit 2 : (edisi "ketika-mengakui-Anda-salah"):
Jika Anda membaca standar C11 yang sebenarnya pada halaman 311 (329 PDF) Anda menemukan:
jj: Menentukan bahwa pengikut d, i, o, u, x, atau Xkonversi specifier berlaku untuk signed charatau unsigned charargumen (argumen akan telah dipromosikan sesuai dengan promosi integer, tapi nilainya akan dikonversi ke signed charatau unsigned charsebelum mencetak); atau bahwa npenentu konversi berikut berlaku untuk penunjuk ke signed charargumen.
"\xc0\xc0abc123"