Rumah >pembangunan bahagian belakang >C++ >Mengapakah `printf` Menunjukkan Output Hex Tidak Dijangka Semasa Mencetak Bait?

Mengapakah `printf` Menunjukkan Output Hex Tidak Dijangka Semasa Mencetak Bait?

Linda Hamilton
Linda Hamiltonasal
2024-12-20 13:09:13944semak imbas

Why Does `printf` Show Unexpected Hex Output When Printing a Byte?

Memahami Output Tidak Dijangka printf Apabila Mencetak Bait sebagai Hex

Apabila bekerja dengan jenis data vektor seperti pixel_data yang mengandungi unsur aksara, adalah perkara biasa untuk menemui hasil yang tidak dijangka apabila cuba mencetak satu bait dalam format perenambelasan. Khususnya, mencetak pixel_data[0] menggunakan printf(" 0x%1x ", pixel_data[0] ) mungkin menghasilkan 0xfffffff5 dan bukannya 0xf5 yang dijangkakan.

Tingkah laku ini timbul daripada ciri printf, di mana pengubahsuai %x menjangkakan integer yang tidak ditandatangani sebagai hujahnya. Akibatnya, nilai char, yang biasanya dinaikkan kepada integer apabila dibekalkan kepada fungsi varargs, dianggap sebagai int oleh printf.

Untuk mendapatkan hasil yang boleh dipercayai, hantaran eksplisit kepada int yang tidak ditandatangani disyorkan :

printf(" 0x%1x ", (unsigned)pixel_data[0] );

Selain itu, lebar medan satu mungkin tidak sesuai, kerana ia menentukan nombor minimum daripada digit untuk dipaparkan dan sekurang-kurangnya satu digit akan sentiasa digunakan.

Jika aksara pada sistem anda dikendalikan sebagai jenis yang ditandatangani, penukaran mungkin menghasilkan penjanaan nilai int tidak bertanda yang besar (mis., fffffff5) untuk nilai aksara negatif. Untuk memastikan nilai bait dianggap sebagai tidak ditandatangani, gunakan aksara yang tidak ditandatangani untuk pixel_data, hantar melalui aksara yang tidak ditandatangani atau gunakan 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` Menunjukkan Output Hex Tidak Dijangka Semasa Mencetak Bait?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn