Bạn có thể sử dụng hh
để cho biết printf
rằng đối số là một ký tự không dấu. Sử dụng 0
để lấy phần đệm bằng 0 và 2
đặt chiều rộng thành 2. x
hoặc X
cho các ký tự hex viết thường / viết hoa.
uint8_t a = 0x0a;
printf("%02hhX", a); // Prints "0A"
printf("0x%02hhx", a); // Prints "0x0a"
Chỉnh sửa : Nếu người đọc lo ngại về khẳng định của 2501 rằng bằng cách nào đó đây không phải là từ định dạng 'chính xác', tôi khuyên họ nên đọc lại printf
liên kết . Đặc biệt:
Mặc dù% c mong đợi đối số int, nhưng vẫn an toàn để chuyển một char vì sự thăng hạng số nguyên diễn ra khi một hàm variadic được gọi.
Các thông số kỹ thuật chuyển đổi chính xác cho các loại ký tự có độ rộng cố định (int8_t, v.v.) được xác định trong tiêu đề <cinttypes>
(C ++) hoặc <inttypes.h>
(C) (mặc dù PRIdMAX, PRIuMAX, v.v. đồng nghĩa với% jd,% ju, v.v.) .
Đối với quan điểm của anh ấy về có dấu và không có dấu, trong trường hợp này không quan trọng vì các giá trị phải luôn dương và dễ dàng phù hợp với một int có dấu. Không có mã định dạng hexideximal có dấu nào cả.
Chỉnh sửa 2 : (ấn bản "khi-thừa-nhận-bạn đã sai"):
Nếu bạn đọc tiêu chuẩn C11 thực tế trên trang 311 (329 của PDF), bạn thấy:
hh: Chỉ định rằng một sau d
, i
, o
, u
, x
, hoặc X
xác định chuyển đổi áp dụng cho một signed char
hoặc unsigned char
đối số (đối số sẽ được thăng chức theo chương trình khuyến mãi số nguyên, nhưng giá trị của nó sẽ được chuyển đổi sang signed char
hoặc unsigned char
trước khi in); hoặc rằng một n
chỉ định chuyển đổi sau áp dụng cho một con trỏ đến một signed char
đối số.
"\xc0\xc0abc123"