首頁 >後端開發 >C++ >為什麼「printf」在列印位元組時顯示意外的十六進位輸出?

為什麼「printf」在列印位元組時顯示意外的十六進位輸出?

Linda Hamilton
Linda Hamilton原創
2024-12-20 13:09:13944瀏覽

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

理解printf 將位元組列印為十六進位時的意外輸出

使用向量資料型別(如包含char 元素的Pixel_data )時,通常會出現以下情況:嘗試以十六進位格式列印單一位元組時遇到意外結果。具體來說,使用 printf(" 0x%1x ", Pixel_data[0] ) 列印 Pixel_data[0] 可能會產生 0xfffffff5,而不是預期的 0xf5。

此行為源自於 printf 的特性,其中 %x 修飾符預期無符號整數作為其參數。因此,char 值(在提供給 varargs 函數時通常會提升為整數)被 printf 視為 int。

為了獲得可靠的結果,建議明確轉換為unsigned int :

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

此外,字段寬度為1 可能並不理想,因為它指定了要顯示的最小位數,並且總是至少有一位數字

如果系統上的char 作為有符號類型處理,則轉換可能會導致為負char 值產生較大的無符號int 值(例如 fffffff5)。為了確保位元組值被視為無符號,請對像素資料使用無符號字符,透過無符號字元進行轉換,或使用遮罩操作:

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

以上是為什麼「printf」在列印位元組時顯示意外的十六進位輸出?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn