Ini lebih merupakan pertanyaan yang aneh daripada pertanyaan penting, tetapi mengapa saat mencetak hex sebagai angka 8 digit dengan angka nol di depan, apakah ini %#08X
Tidak menampilkan hasil yang sama 0x%08X
?
Ketika saya mencoba menggunakan yang pertama, 08
bendera pemformatan dihapus, dan itu tidak berfungsi dengan adil 8
.
Sekali lagi saya hanya ingin tahu.
0x%.8X
? Itu akan memimpin-isi dengan nol. (0x
itu hanya basa-basi, tetapi Anda mungkin sudah tahu itu).Jawaban:
Bagian
#
memberi Anda0x
dalam string output. The0
danx
hitungan terhadap karakter "8" Anda tercantum di08
bagian. Anda perlu meminta 10 karakter jika ingin sama.Juga mengubah kasus
x
, mempengaruhi casing karakter yang dihasilkan.sumber
14F
?i = 0;
, versi yang menggunakan%#
tidak akan menyertakan0x
awalan."0x" diperhitungkan terhadap delapan karakter. Kamu butuh
"%#010x"
.Perhatikan bahwa
#
tidak tidak menambahkan 0x untuk 0 - hasilnya akan0000000000
- sehingga Anda mungkin sebenarnya hanya harus menggunakan"0x%08x"
pula.sumber
The
%#08X
konversi harus mendahului nilai dengan0X
; yang dibutuhkan oleh standar. Tidak ada bukti dalam standar bahwa#
harus mengubah perilaku08
bagian dari spesifikasi kecuali bahwa0X
awalan dihitung sebagai bagian dari panjang (jadi Anda mungkin ingin / perlu menggunakan%#010X
. Jika, seperti saya, Anda suka hex Anda disajikan sebagai0x1234CDEF
, maka Anda harus menggunakan0x%08X
untuk mencapai hasil yang diinginkan. Anda dapat menggunakan%#.8X
dan itu juga harus memasukkan nol terkemuka.Coba variasi pada kode berikut:
Pada mesin RHEL 5, dan juga pada Mac OS X (10.7.5), outputnya adalah:
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.
(Penekanan ditambahkan.)
Perhatikan bahwa menggunakan
%#X
akan menggunakan huruf besar untuk digit hex dan0X
sebagai awalan; menggunakan%#x
akan menggunakan huruf kecil untuk digit hex dan0x
sebagai awalan. Jika Anda lebih suka0x
sebagai awalan dan atas-kasus surat, Anda harus kode0x
secara terpisah:0x%X
. Pengubah format lain dapat ditambahkan sesuai kebutuhan, tentu saja.Untuk mencetak alamat, gunakan
<inttypes.h>
tajuk danuintptr_t
jenis danPRIXPTR
format makro:Contoh output:
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).sumber