Meneroka Gelagat Ingin Tahu printf dengan Pencetakan Hex Aksara
Dalam bidang pengaturcaraan, seseorang mungkin menghadapi situasi di mana mencetak satu bait dalam format heksadesimal menggunakan printf menghasilkan keputusan yang tidak dijangka. Kes yang ingin tahu timbul apabila bekerja dengan vektor aksara sebagai data piksel. Percubaan untuk mencetak satu aksara menggunakan pengubah suai "%1x" selalunya menghasilkan hasil yang membingungkan.
Misteri Terbongkar
Enigma terletak pada jenis gelagat promosi yang dipamerkan oleh printf. Apabila menghantar aksara (char) kepada printf sebagai fungsi varargs, ia biasanya dinaikkan pangkat kepada integer (int). Walau bagaimanapun, pengubah suai "%x" menjangkakan integer tidak ditandatangani (int tidak ditandatangani) sebagai input. Ketidakselarasan ini membawa kepada tingkah laku yang tidak ditentukan.
Untuk membetulkan perkara ini dan memastikan hasil yang boleh diramal, pemutus watak yang jelas kepada int yang tidak ditandatangani adalah penting. Pengubahsuaian berikut menggambarkan penyelesaian:
printf(" 0x%1x ", (unsigned)pixel_data[0] );
Perlu diperhatikan bahawa lebar medan satu mempunyai utiliti terhad dalam konteks ini, kerana sekurang-kurangnya satu digit sentiasa diperlukan untuk perwakilan perenambelasan.
Implikasi untuk Data yang Ditandatangani dan Tidak Ditandatangani
Pada platform di mana char berada ditetapkan sebagai ditandatangani, nilai aksara negatif akan diterjemahkan kepada nilai integer besar yang tidak ditandatangani apabila dinaikkan pangkat. Untuk mengelakkan ini, pertimbangkan untuk menggunakan aksara tidak bertanda untuk data piksel atau menggunakan penghantaran int tidak bertanda atau sambungan sifar berasaskan topeng. Berikut ialah contoh pendekatan alternatif:
printf(" 0x%x ", (unsigned)(unsigned char)pixel_data[0] ); printf(" 0x%x ", (unsigned)pixel_data[0] & 0xffU );
Penyelesaian ini memastikan penukaran nilai bait yang diingini kepada integer tidak bertanda, yang membawa kepada output yang konsisten dan dijangka.
Atas ialah kandungan terperinci Mengapakah `printf` Menghasilkan Keputusan Yang Tidak Dijangka Apabila Mencetak Aksara Tunggal sebagai Hex?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!