Rumah > pembangunan bahagian belakang > C++ > Mengapakah `printf` Menghasilkan Keputusan Yang Tidak Dijangka Apabila Mencetak Aksara Tunggal sebagai Hex?

Mengapakah `printf` Menghasilkan Keputusan Yang Tidak Dijangka Apabila Mencetak Aksara Tunggal sebagai Hex?

Patricia Arquette
Lepaskan: 2024-12-08 09:31:17
asal
368 orang telah melayarinya

Why Does `printf` Produce Unexpected Results When Printing Single Characters as Hex?

Meneroka Gelagat Ingin Tahu printf dengan Pencetakan Hex Aksara

Dalam bidang pengaturcaraan, seseorang mungkin menghadapi situasi di mana mencetak satu bait dalam format heksadesimal menggunakan printf menghasilkan keputusan yang tidak dijangka. Kes yang ingin tahu timbul apabila bekerja dengan vektor aksara sebagai data piksel. Percubaan untuk mencetak satu aksara menggunakan pengubah suai "%1x" selalunya menghasilkan hasil yang membingungkan.

Misteri Terbongkar

Enigma terletak pada jenis gelagat promosi yang dipamerkan oleh printf. Apabila menghantar aksara (char) kepada printf sebagai fungsi varargs, ia biasanya dinaikkan pangkat kepada integer (int). Walau bagaimanapun, pengubah suai "%x" menjangkakan integer tidak ditandatangani (int tidak ditandatangani) sebagai input. Ketidakselarasan ini membawa kepada tingkah laku yang tidak ditentukan.

Untuk membetulkan perkara ini dan memastikan hasil yang boleh diramal, pemutus watak yang jelas kepada int yang tidak ditandatangani adalah penting. Pengubahsuaian berikut menggambarkan penyelesaian:

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

Perlu diperhatikan bahawa lebar medan satu mempunyai utiliti terhad dalam konteks ini, kerana sekurang-kurangnya satu digit sentiasa diperlukan untuk perwakilan perenambelasan.

Implikasi untuk Data yang Ditandatangani dan Tidak Ditandatangani

Pada platform di mana char berada ditetapkan sebagai ditandatangani, nilai aksara negatif akan diterjemahkan kepada nilai integer besar yang tidak ditandatangani apabila dinaikkan pangkat. Untuk mengelakkan ini, pertimbangkan untuk menggunakan aksara tidak bertanda untuk data piksel atau menggunakan penghantaran int tidak bertanda atau sambungan sifar berasaskan topeng. Berikut ialah contoh pendekatan alternatif:

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

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

Penyelesaian ini memastikan penukaran nilai bait yang diingini kepada integer tidak bertanda, yang membawa kepada output yang konsisten dan dijangka.

Atas ialah kandungan terperinci Mengapakah `printf` Menghasilkan Keputusan Yang Tidak Dijangka Apabila Mencetak Aksara Tunggal sebagai Hex?. 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