คุณสามารถใช้hhเพื่อบอกprintfว่าอาร์กิวเมนต์เป็นถ่านที่ไม่ได้ลงชื่อ ใช้0เพื่อเพิ่มช่องว่างเป็นศูนย์และ2กำหนดความกว้างเป็น 2 xหรือXสำหรับอักขระเลขฐานสิบหก / ตัวพิมพ์ใหญ่
uint8_t a = 0x0a;
printf("%02hhX", a);
printf("0x%02hhx", a);
แก้ไข : หากผู้อ่านกังวลเกี่ยวกับการยืนยันของ 2501 ว่านี่ไม่ใช่ตัวระบุรูปแบบที่ 'ถูกต้อง' ฉันขอแนะนำให้อ่านprintfลิงก์อีกครั้ง โดยเฉพาะ:
แม้ว่า% c จะคาดหวังอาร์กิวเมนต์ int แต่ก็สามารถส่งผ่านถ่านได้อย่างปลอดภัยเนื่องจากการส่งเสริมจำนวนเต็มที่เกิดขึ้นเมื่อมีการเรียกใช้ฟังก์ชันตัวแปร
ข้อกำหนดการแปลงที่ถูกต้องสำหรับความกว้างคงที่ชนิดตัวอักษร (int8_t ฯลฯ ) ที่กำหนดไว้ในส่วนหัว<cinttypes>(C ++) หรือ<inttypes.h>(C) (แม้ว่า PRIdMAX, PRIuMAX ฯลฯ เป็นตรงกันกับ% JD% จู ฯลฯ )
สำหรับประเด็นของเขาเกี่ยวกับการลงนามและไม่ได้ลงนามในกรณีนี้ไม่สำคัญเนื่องจากค่าต้องเป็นบวกเสมอและพอดีกับ int ที่ลงชื่อ ไม่มีตัวระบุรูปแบบ hexideximal ที่ลงชื่อแล้ว
แก้ไข 2 : (ฉบับ "เมื่อจะยอมรับคุณผิด"):
หากคุณอ่านมาตรฐาน C11 จริงในหน้าที่ 311 (329 ของ PDF) คุณจะพบ:
HH: ระบุว่าต่อไปนี้d, i, o, u, xหรือXแปลงระบุนำไปใช้signed charหรือunsigned charอาร์กิวเมนต์ (อาร์กิวเมนต์จะได้รับการเลื่อนตำแหน่งตามโปรโมชั่นจำนวนเต็ม แต่ค่าของมันจะถูกแปลงไปsigned charหรือunsigned charก่อนที่จะพิมพ์); หรือตัวnระบุการแปลงต่อไปนี้ใช้กับตัวชี้ไปยังsigned charอาร์กิวเมนต์
"\xc0\xc0abc123"