Memahami printf Gelagat Pencetakan Heksadesimal
Apabila mencetak perwakilan perenambelasan aksara menggunakan printf, hasil yang tidak dijangka boleh timbul jika aksara dilalui tanpa pemutus eksplisit. Ini disebabkan oleh kelakuan printf, yang menjangkakan parameter int yang tidak ditandatangani untuk pengubah suai %x.
Promosi Char dan Tingkah Laku Tidak Ditakrifkan
Dalam C , aksara (char ) biasanya dinaikkan pangkat kepada int dalam fungsi varargs seperti printf. Walau bagaimanapun, saiz int berbeza-beza antara platform, yang berpotensi menyebabkan gelagat yang tidak ditentukan jika aksara tidak dipancarkan secara eksplisit.
Penghantaran Eksplisit untuk Hasil Yang Boleh Diramal
Untuk memastikan hasil yang boleh diramal , secara eksplisit menghantar char ke int yang tidak ditandatangani sebelum mencetak. Ini akan menghalang tingkah laku yang tidak dijangka dan memaparkan perwakilan heksadesimal yang betul:
printf(" 0x%1x ", (unsigned)pixel_data[0] );
Pertimbangan Lebar Medan
Perhatikan bahawa menetapkan lebar medan 1 untuk pencetakan heksadesimal bukanlah khusus. berguna, kerana ia menentukan bilangan minimum digit untuk dipaparkan dan sekurang-kurangnya satu digit adalah sentiasa perlu.
Pengendalian Char Tanpa Tandatangan
Sekiranya char pada platform ditandatangani, adalah penting untuk mengendalikannya dengan sewajarnya. Untuk mengelak daripada menukar nilai aksara negatif kepada nilai int tidak ditandatangani yang besar, pertimbangkan untuk menggunakan aksara tidak ditandatangani atau menghantar nilai secara eksplisit menggunakan aksara tidak ditandatangani atau operasi penyamaran:
printf(" 0x%x ", (unsigned)(unsigned char)pixel_data[0] );
printf(" 0x%x ", (unsigned)pixel_data[0] & 0xffU );
Atas ialah kandungan terperinci Mengapakah `printf` Menghasilkan Output Heksadesimal Tidak Dijangka Semasa Mencetak Aksara?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!