printf: Mencetak Nilai Heksadesimal Dengan Tepat
Apabila bekerja dengan vektor aksara, adalah perkara biasa untuk menghadapi percanggahan semasa mencetak bait individu dalam perenambelasan format menggunakan printf. Isu ini timbul apabila cuba mencetak satu aksara, iaitu hanya satu bait, tetapi sebaliknya mendapat nilai berbilang bait.
Sebab di sebalik tingkah laku ini terletak pada padanan jenis printf. Pengubah suai %x menjangkakan parameter int yang tidak ditandatangani, dan char biasanya dinaikkan pangkat kepada int apabila dihantar kepada fungsi hujah pembolehubah. Promosi ini boleh membawa kepada hasil yang salah apabila mencetak nilai aksara tunggal.
Untuk menyelesaikan isu ini, seseorang mesti menghantar aksara secara eksplisit kepada int yang tidak ditandatangani untuk memastikan hasil yang boleh diramal. Sebagai contoh, kod berikut akan mencetak satu bait dengan tepat:
printf(" 0x%1x ", (unsigned)pixel_data[0]);
Adalah penting untuk ambil perhatian bahawa lebar medan satu tidak begitu berguna dalam konteks ini, kerana ia hanya menentukan bilangan minimum digit untuk dipaparkan. Walau bagaimanapun, jika anda ingin menganggap nilai bait sebagai nilai tidak ditandatangani dan lanjutkan sifarnya apabila menukar kepada int tidak ditandatangani, anda boleh menggunakan aksara tidak ditandatangani untuk vektor atau melakukan hantaran tertentu:
printf(" 0x%x ", (unsigned)(unsigned char)pixel_data[0]);
Sebagai alternatif, anda boleh gunakan operasi topeng selepas promosi untuk mencapai hasil yang sama:
printf(" 0x%x ", (unsigned)pixel_data[0] & 0xffU);
Dengan mengikuti teknik ini, anda boleh memastikan printf mencetak nilai perenambelasan dengan tepat, walaupun semasa berurusan dengan bait tunggal.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mencetak Nilai Heksadesimal Bait Tunggal Dengan Tepat Menggunakan printf?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!