簡體   English   中英

為什么 printf 在打印十六進制時不只打印出一個字節?

[英]Why does printf not print out just one byte when printing hex?

pixel_datacharvector

當我執行printf(" 0x%1x ", pixel_data[0] )我期待看到0xf5

但是我得到0xfffffff5就好像我正在打印一個 4 字節的整數而不是 1 字節。

為什么是這樣? 我給了printf一個要打印的char ——它只有 1 個字節,那么為什么printf打印 4?

注意。 printf實現包含在第三方 API 中,但只是想知道這是否是標准printf的功能?

您可能會遇到未定義行為的良性形式,因為%x修飾符需要一個unsigned int參數,而當傳遞給varargs函數時, char通常會被提升為int

您應該將 char 顯式轉換為unsigned int以獲得可預測的結果:

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

請注意,字段寬度為 1 不是很有用。 它僅指定要顯示的最少位數,並且在任何情況下都至少需要一位。

如果您平台上的char是有符號的,那么此轉換會將負char值轉換為大的unsigned int值(例如fffffff5 )。 如果要將字節值視為無符號值,並且在轉換為unsigned int時僅將零擴展為unsigned int ,則應將unsigned char用於pixel_data ,或通過unsigned char或在升級后使用屏蔽操作。

例如

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

或者

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

更好地使用標准格式標志

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

然后您的編譯器為您放置十六進制前綴。

使用%hhx

printf("%#04hhx ", foo);

那么length修飾符是最小長度。

printf寬度說明符實際上是最小寬度。 您可以執行printf(" 0x%2x ", pixel_data[0] & 0xff)來打印低字節(注意 2,如果pixel_data[0]是例如0xffffff02 ,則實際打印兩個字符)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM