Anda bisa menggunakan hh
untuk memberitahu printf
bahwa argumennya adalah unsigned char. Gunakan 0
untuk mendapatkan bantalan nol dan 2
untuk mengatur lebar ke 2. x
atau X
untuk 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 printf
tautan 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 X
konversi specifier berlaku untuk signed char
atau unsigned char
argumen (argumen akan telah dipromosikan sesuai dengan promosi integer, tapi nilainya akan dikonversi ke signed char
atau unsigned char
sebelum mencetak); atau bahwa n
penentu konversi berikut berlaku untuk penunjuk ke signed char
argumen.
"\xc0\xc0abc123"