程序員面試題之從字節截斷談起

  在此通過一個例子引入,請看下面的例子:

      1

      運行後的結果如下所示:0x00000078,0x00000078。可是當把a的值改爲0x00000088後得出的結果改變了:0x00000088,0xFFFFFF88,這是什麼原因呢?經過多方查找和測試,最後找到了相關的解釋。要了解這個原理我們現補充一下關於大端法(big endian)和小端法(little endian)的知識。

      假設變量類型爲int,位於地址0X100處,根據不同的機器處理器,有兩種存儲方式:

2

而我們常用的Intel處理器使用的是小端法,暫時就介紹這麼多。下面我們引入一個概念,字節截斷,我們稍微修改一下代碼爲:

      3

      輸出的結果爲:4 ,這說明了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。於是所有的結果都順理成章了。

本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/ideaseek/archive/2010/07

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章