Việc %#08X
chuyển đổi phải đi trước giá trị với 0X
; đó là yêu cầu của tiêu chuẩn. Không có bằng chứng nào trong tiêu chuẩn cho thấy #
nên thay đổi hành vi của 08
một phần của đặc tả ngoại trừ 0X
tiền tố được tính là một phần của độ dài (vì vậy bạn có thể muốn / cần sử dụng %#010X
. Nếu, như tôi, bạn thích hex của bạn được trình bày như 0x1234CDEF
, sau đó bạn phải sử dụng 0x%08X
để đạt được kết quả mong muốn. Bạn có thể sử dụng %#.8X
và điều đó cũng nên chèn các số 0 đứng đầu.
Hãy thử các biến thể trên mã sau đây:
#include <stdio.h>
int main(void)
{
int j = 0;
printf("0x%.8X = %#08X = %#.8X = %#010x\n", j, j, j, j);
for (int i = 0; i < 8; i++)
{
j = (j << 4) | (i + 6);
printf("0x%.8X = %#08X = %#.8X = %#010x\n", j, j, j, j);
}
return(0);
}
Trên máy RHEL 5 và cả trên Mac OS X (10.7.5), đầu ra là:
0x00000000 = 00000000 = 00000000 = 0000000000
0x00000006 = 0X000006 = 0X00000006 = 0x00000006
0x00000067 = 0X000067 = 0X00000067 = 0x00000067
0x00000678 = 0X000678 = 0X00000678 = 0x00000678
0x00006789 = 0X006789 = 0X00006789 = 0x00006789
0x0006789A = 0X06789A = 0X0006789A = 0x0006789a
0x006789AB = 0X6789AB = 0X006789AB = 0x006789ab
0x06789ABC = 0X6789ABC = 0X06789ABC = 0x06789abc
0x6789ABCD = 0X6789ABCD = 0X6789ABCD = 0x6789abcd
Tôi hơi ngạc nhiên khi điều trị 0; Tôi không rõ tại sao 0X
tiền tố bị bỏ qua, nhưng với hai hệ thống riêng biệt làm điều đó, nó phải là tiêu chuẩn. Nó xác nhận định kiến của tôi chống lại #
lựa chọn.
Việc điều trị bằng 0 là theo tiêu chuẩn.
6 Các ký tự cờ và ý nghĩa của chúng là:
...
#
Kết quả được chuyển đổi thành "dạng thay thế". ... Đối với x
(hoặc X
) chuyển đổi, một kết quả khác không có 0x
(hoặc 0X
) tiền tố với nó. ...
(Nhấn mạnh thêm.)
Lưu ý rằng việc sử dụng %#X
sẽ sử dụng các chữ cái viết hoa cho các chữ số hex và 0X
làm tiền tố; việc sử dụng %#x
sẽ sử dụng các chữ cái viết thường cho các chữ số hex và 0x
làm tiền tố. Nếu bạn thích 0x
làm tiền tố và chữ in hoa, bạn phải mã 0x
riêng : 0x%X
. Các sửa đổi định dạng khác có thể được thêm vào khi cần thiết, tất nhiên.
Để in địa chỉ, sử dụng <inttypes.h>
tiêu đề và uintptr_t
loại và PRIXPTR
macro định dạng:
#include <inttypes.h>
#include <stdio.h>
int main(void)
{
void *address = &address; // &address has type void ** but it converts to void *
printf("Address 0x%.12" PRIXPTR "\n", (uintptr_t)address);
return 0;
}
Ví dụ đầu ra:
Address 0x7FFEE5B29428
Chọn chất độc của bạn theo độ dài - Tôi thấy rằng độ chính xác 12 hoạt động tốt cho các địa chỉ trên máy Mac chạy macOS. Kết hợp với .
để chỉ định độ chính xác tối thiểu (chữ số), nó định dạng địa chỉ một cách đáng tin cậy. Nếu bạn đặt độ chính xác thành 16, 4 chữ số thêm luôn là 0 theo kinh nghiệm của tôi trên Mac, nhưng chắc chắn sẽ có trường hợp sử dụng 16 thay vì 12 trong mã 64 bit di động (nhưng bạn sẽ sử dụng 8 cho Mã 32 bit).
0x%.8X
sao Điều đó sẽ dẫn đầy với số không. (0x
đây chỉ là một lời mở đầu, nhưng có khả năng bạn đã biết về điều đó).