print列印16進位制時前面會多很多FF,解決辦法。
最近在做一個3des軟加密的專案,發現在C語言中用printf()函式列印字元型變數時,如果想採用"%x"的格式將字元型變數值以十六進位制形式列印出來,會出現一個小問題,如下:
- char buf[10] = {0};
- buf[0] = 0xbf;
- printf("%2x\n\n\n", buf[0]); /*在終端將會顯示成:ffffffbf*/
- buf[1] = 0x7f;
- 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]
相關文章
- python以16進位制列印位元組陣列Python陣列
- Python print函式控制檯中文輸出16進位制問題Python函式
- 口算 16 進位制轉換 10 進位制,但只適合兩位的 16 進位制
- vue中 window.print() 解決列印和隱藏同時進行的問題Vue
- Java中8進位制和16進位制的表示方法Java
- Java 16進位制字串 取反Java字串
- 進位制詳解:二進位制、八進位制和十六進位制
- Pytnon變數print列印計數顯示前面補零 0001、0002變數
- printf()將10進位制數安照輸出16進位制,8進位制輸出
- C printf按8進位制、10進位制、16進位制輸出以及高位補0
- oracle_16進位制與10進位制轉換小示例Oracle
- C語言中printf打出2進位制與16進位制數C語言
- 16進位制字串轉位元組字串
- 負數補碼(16進位制轉10進位制的負數)
- 在c語言中輸出8進位制數,16進位制數C語言
- C# 解析16進位制字串。將16進位制字串轉換成明文字串C#字串
- C# 獲取時間戳並從10進位制時間戳轉換成16進位制byte陣列C#時間戳陣列
- 電腦前面耳機沒聲音的解決辦法 電腦前面插耳機沒聲音怎麼辦
- 位元組流轉16進位制字串字串
- 資料轉換-16進位制字元字元
- C語言進位制轉換與列印C語言
- JavaScript中的多種進位制與進位制轉換JavaScript
- Python 3 進階 —— print 列印和輸出Python
- 二進位制方式解決 power 問題
- 彙編實現10進位制轉16進位制並以ASCII碼輸出ASCII
- c++ 16進位制資料轉doubleC++
- JavaScript 八進位制與二進位制表示法JavaScript
- JavaScript八進位制與二進位制表示法JavaScript
- PHP負數轉16進位制再轉到10進位制的正確姿勢PHP
- byte轉16進位制String時為什麼要乘上0xff
- Python中的棧溢位及解決辦法Python
- 【進位制轉換】二進位制、十六進位制、十進位制、八進位制對應關係
- 十六進位制減法計算
- AndroidStudio進行Build時出現DexArchiveMergerException異常的解決辦法AndroidUIHiveException
- C++資料格式化5 - uint轉換成十六進位制字串&二進位制的data列印成十六進位制字串C++UI字串
- 計算機基礎進位制轉換(二進位制、八進位制、十進位制、十六進位制)計算機
- 二進位制,八進位制,十進位制,十六進位制的相互轉換
- 16進位制的簡單運算(迴圈)
- JavaScript RGB轉換成16進位制顏色JavaScript