![](/img/trans.png)
[英]not printing out all alphabet just one letter but it needs to print out every letter after the one that was entered
[英]Why does printf not print out just one byte when printing hex?
pixel_data
是char
的vector
。
當我執行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.