你的研究對象是char數據類型(自稱要求輸出每一個字節即是明證),不管是不是unsigned的,它都是一個8位的數據,即2位十六進制形式,你用%02x輸出就是這種數據類型的正當用法,這就叫直觀代碼。莫名其妙地把char當作int來處理,正是因爲對底層内幕知道太多造成的。
你也不要以爲那是什麽擴展形式,對有符號數據而言,當認爲一個整型數是負數的時候,它在整個字長範圍内的所有高位都是1,而不單單是最高位爲1,這個問題我在很早以前分析移位操作的時候就警告過大家的,符號型整數右移操作將把符號位一直帶進來,即左邊不斷填充1,而不是像在聲明爲unsigned時那樣左移右移都會在兩邊填充0。聲明爲8位的負數,它的所有高位都爲1,當你把數據視爲32位(對64位環境下默認int是64位)的時候,它的所有高位都同樣也是1,所以輸出時對不是0的位,也把十六進制的f都輸出來。當你輸入輸出char型數據的時候,按定義它就是8位數據,祇要老老實實地按8位輸出就必定沒錯,不要管什麽C/C++把char隱性視之爲int處理的鬼話——其實輸出時看到char變成16位或32位數據,你都應該知道有問題了,不需要想那麽久才明白道理。
[
本帖最后由 TonyDeng 于 2014-3-5 20:28 编辑 ]