print列印16進位制時前面會多很多FF,解決辦法。

拖布鞋發表於2015-12-03

最近在做一個3des軟加密的專案,發現在C語言中用printf()函式列印字元型變數時,如果想採用"%x"的格式將字元型變數值以十六進位制形式列印出來,會出現一個小問題,如下:

C程式碼  
  1. char buf[10] = {0};  
  2. buf[0] = 0xbf;  
  3. printf("%2x\n\n\n", buf[0]);            /*在終端將會顯示成:ffffffbf*/  
  4.   
  5. buf[1] = 0x7f;  
  6. printf("%2x\n\n\n", buf[1]);            /*在終端將會顯示成:7f*/  

 為什麼buf[0]不像buf[1]顯示的那樣,顯示2個十六進位制數bf呢?

 

研究發現,只要字元型變數值的二進位制第一位是1,就會如buf[0]所顯示的那樣,出現6個f。

而格式輸出函式printf中會對所輸出的變數做有符號/無符號型的判斷。如果是有符號型變數,且該值二進位制首位為1(如我們定義的是char buf[100],且buf[0]中為0xbf),則會按照補碼形式前面全置為1,也就是全為f。

按照上面述說的,如果把buf宣告為unsigned char型,則顯示會變成:bf

如果程式需要一個有符號型的變數以十六進位制形式輸出,且只顯示兩位,可以強制型別轉換為無符號型變數,如上面的buf[0],可以轉換成:(unsigned char)buf[0]

相關文章