The %#08Xkonversi harus mendahului nilai dengan 0X; yang dibutuhkan oleh standar. Tidak ada bukti dalam standar bahwa #harus mengubah perilaku 08bagian dari spesifikasi kecuali bahwa 0Xawalan dihitung sebagai bagian dari panjang (jadi Anda mungkin ingin / perlu menggunakan %#010X. Jika, seperti saya, Anda suka hex Anda disajikan sebagai 0x1234CDEF, maka Anda harus menggunakan 0x%08Xuntuk mencapai hasil yang diinginkan. Anda dapat menggunakan %#.8Xdan itu juga harus memasukkan nol terkemuka.
Coba variasi pada kode berikut:
#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);
}
Pada mesin RHEL 5, dan juga pada Mac OS X (10.7.5), outputnya adalah:
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
Saya sedikit terkejut dengan perlakuan 0; Saya tidak jelas mengapa 0Xawalan dihilangkan, tetapi dengan dua sistem terpisah melakukannya, itu harus standar. Ini menegaskan prasangka saya terhadap #opsi tersebut.
Perlakuan nol sesuai dengan standar.
¶6 Karakter bendera dan artinya adalah:
...
#Hasilnya dikonversi ke "bentuk alternatif". ... Untuk x(atau X) konversi, hasil bukan nol telah 0x(atau 0X) diawali dengan itu. ...
(Penekanan ditambahkan.)
Perhatikan bahwa menggunakan %#Xakan menggunakan huruf besar untuk digit hex dan 0Xsebagai awalan; menggunakan %#xakan menggunakan huruf kecil untuk digit hex dan 0xsebagai awalan. Jika Anda lebih suka 0xsebagai awalan dan atas-kasus surat, Anda harus kode 0xsecara terpisah: 0x%X. Pengubah format lain dapat ditambahkan sesuai kebutuhan, tentu saja.
Untuk mencetak alamat, gunakan <inttypes.h>tajuk dan uintptr_tjenis dan PRIXPTRformat makro:
#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;
}
Contoh output:
Address 0x7FFEE5B29428
Pilih racun Anda pada panjang - Saya menemukan bahwa ketepatan 12 bekerja dengan baik untuk alamat pada Mac yang menjalankan MacOS. Dikombinasikan dengan .untuk menentukan presisi minimum (digit), ini memformat alamat dengan andal. Jika Anda mengatur presisi ke 16, tambahan 4 digit selalu 0 dalam pengalaman saya di Mac, tetapi pasti ada kasus yang harus dibuat untuk menggunakan 16 bukannya 12 dalam kode 64-bit portabel (tetapi Anda akan menggunakan 8 untuk Kode 32-bit).
0x%.8X? Itu akan memimpin-isi dengan nol. (0xitu hanya basa-basi, tetapi Anda mungkin sudah tahu itu).