คุณสามารถใช้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"