在此通過乙個例子引入,請看下面的例子:
執行後的結果如下所示:0x00000078,0x00000078。可是當把a的值改為0x00000088後得出的結果改變了:0x00000088,0xffffff88,這是什麼原因呢?經過多方查詢和測試,最後找到了相關的解釋。要了解這個原理我們現補充一下關於大端法(big endian)和小端法(little endian)的知識。
而我們常用的intel處理器使用的是小端法,暫時就介紹這麼多。下面我們引入乙個概念,位元組截斷,我們稍微修改一下**為:
輸出的結果為:
,這說明了a佔位4個位元組,而i佔位1個位元組,這樣的話就會截斷3個位元組,於是只剩下0x78,因為輸出方式為%08x,所以補齊相差的位置,得出了了0x00000078的結果。而這兩個0x78的結果相同可是實質卻不同,i佔1個位元組所以儲存的只是0x78,後面的0是printf新增進去的,而b佔4個位元組,儲存的是通過位元組擴充套件後的0x00000078。
第二個問題就出現了,擴充套件的規則是什麼?為什麼0x88的時候會出現0xffffff88的結果呢?筆者為了深入研究這個問題,從0x18一直試到0xf8,發現了規律,筆者猜測處理器對於補齊差位的策略是,把最高位化為二進位制,88的最高位二進位制為1000,最高位為1,是有符號位,所以一律補齊1,做有符號擴充套件,而78的二進位制位0111,最高位為0,做無符號擴充套件,補齊0。於是所有的結果都順理成章了。
程式設計師面試題之從位元組截斷談起
在此通過乙個例子引入,請看下面的例子 執行後的結果如下所示 0x00000078,0x00000078。可是當把a的值改為0x00000088後得出的結果改變了 0x00000088,0xffffff88,這是什麼原因呢?經過多方查詢和測試,最後找到了相關的解釋。要了解這個原理我們現補充一下關於大端...
程式設計師面試題
2013 10 12 14 05 867人閱讀收藏 舉報9月5日,華為2014校園招聘的機試題目 通過鍵盤輸入一串小寫字母 a z 組成的字串。請編寫乙個字串壓縮程式,將字串中連續出席的重複字母進行壓縮,並輸出壓縮後的字串。壓縮規則 1 僅壓縮連續重複出現的字元。比如字串 abcbc 由於無連續重複...
程式設計師必備面試題
1 使用main函式的引數,實現乙個整數計算器,程式可以接受三個引數,第乙個引數 a 選項執行加法,s 選項執行減法,m 選項執行乘法,d 選項執行除法,後面兩個引數為運算元。例如 輸入test.exe a 1 2 執行1 2輸出3 define crt secure no warnings 1 i...