Rumah > pembangunan bahagian belakang > C++ > Mengapakah `printf` Menghasilkan Output Heksadesimal Tidak Dijangka Semasa Mencetak Aksara?

Mengapakah `printf` Menghasilkan Output Heksadesimal Tidak Dijangka Semasa Mencetak Aksara?

Patricia Arquette
Lepaskan: 2024-12-08 12:06:12
asal
555 orang telah melayarinya

Why Does `printf` Produce Unexpected Hexadecimal Output When Printing Characters?

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] );
Salin selepas log masuk

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] );
Salin selepas log masuk
printf(" 0x%x ", (unsigned)pixel_data[0] & 0xffU );
Salin selepas log masuk

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!

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