Rumah > pembangunan bahagian belakang > C++ > Mengapakah `printf` Menunjukkan Output Tidak Dijangka Semasa Mencetak Bait Perenambelasan daripada Vektor Char?

Mengapakah `printf` Menunjukkan Output Tidak Dijangka Semasa Mencetak Bait Perenambelasan daripada Vektor Char?

Barbara Streisand
Lepaskan: 2024-12-07 07:04:11
asal
1001 orang telah melayarinya

Why Does `printf` Show Unexpected Output When Printing Hexadecimal Bytes from a Char Vector?

Output Tidak Dijangka daripada printf Semasa Mencetak Bait Perenambelasan

Apabila bekerja dengan vektor aksara (data_pixel), mencetak satu bait sebagai nilai perenambelasan (printf(" 0x %1x ", pixel_data[0])) mungkin secara tidak dijangka menghasilkan integer empat bait (0xfffffff5) dan bukannya nilai yang dimaksudkan (0xf5).

Punca Isu

Printf biasanya menjangkakan parameter integer yang tidak ditandatangani untuk pengubah suai %x. Walau bagaimanapun, aksara dinaikkan kepada int apabila dihantar ke fungsi varargs seperti printf. Promosi ini menghasilkan pencetakan bait tambahan.

Menyelesaikan Isu

Untuk memastikan hasil yang boleh diramal, hantar aksara secara eksplisit ke int yang tidak ditandatangani:

printf(" 0x%1x ", (unsigned)pixel_data[0]);
Salin selepas log masuk

Pertimbangan untuk Jenis Pembolehubah

  • Tentukan pixel_data sebagai aksara tidak bertanda untuk dirawat bait sebagai nilai yang tidak ditandatangani.
  • Sebagai alternatif, hantar ke aksara yang tidak ditandatangani dalam pernyataan printf:
printf(" 0x%x ", (unsigned)(unsigned char)pixel_data[0]);
Salin selepas log masuk
  • Gunakan operasi penyamaran untuk melanjutkan sifar apabila menukar kepada tidak ditandatangani int:
printf(" 0x%x ", (unsigned)pixel_data[0] & 0xffU);
Salin selepas log masuk

Bidang Memahami Lebar

Lebar medan %1x menentukan bilangan minimum digit untuk dipaparkan. Walau bagaimanapun, ia mempunyai kegunaan terhad dalam konteks ini kerana sekurang-kurangnya satu digit sentiasa diperlukan.

Atas ialah kandungan terperinci Mengapakah `printf` Menunjukkan Output Tidak Dijangka Semasa Mencetak Bait Perenambelasan daripada Vektor Char?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan