The %#08X
konversi harus mendahului nilai dengan 0X
; yang dibutuhkan oleh standar. Tidak ada bukti dalam standar bahwa #
harus mengubah perilaku 08
bagian dari spesifikasi kecuali bahwa 0X
awalan 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%08X
untuk mencapai hasil yang diinginkan. Anda dapat menggunakan %#.8X
dan 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 0X
awalan 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 %#X
akan menggunakan huruf besar untuk digit hex dan 0X
sebagai awalan; menggunakan %#x
akan menggunakan huruf kecil untuk digit hex dan 0x
sebagai awalan. Jika Anda lebih suka 0x
sebagai awalan dan atas-kasus surat, Anda harus kode 0x
secara terpisah: 0x%X
. Pengubah format lain dapat ditambahkan sesuai kebutuhan, tentu saja.
Untuk mencetak alamat, gunakan <inttypes.h>
tajuk dan uintptr_t
jenis dan PRIXPTR
format 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. (0x
itu hanya basa-basi, tetapi Anda mungkin sudah tahu itu).