計算機字節序列問題

看到論壇有人問一道題,說是曙光面試題。

http://topic.csdn.net/u/20111210/23/73048ed6-68d6-4678-a2b4-1d21c5b62c29.html

#include <stdio.h>

void main()
{
    int a = 0x12345678;
    int b = 0x567890AB;
    int c = 0x7890ABCD;
    
    char * p = (char*)&a;
    char * q = p + 2;
    int x = *(int*)q;
    
    printf("x=%X",x);
}

這段代碼主要的問題就是把int*轉換成char*之後取到的數值。


假設目標主機是小端序列(little-endian),常用的x86,x64都是這種類型的。

那麼:0x12345678在內存中存儲結構應該是 0x78,0x56,0x34,0x12.

這個很容易測試的,打開調試器,打個斷點看內存就知道。

這種情況下

char * p = (char*)&a; 的結果應該是0x78

char * q = p + 2;的結果應該是0x34

int x = *(int*)q;

char*轉成int*,一字節變4字節。q指向數值0x34,那麼如果把它轉成int*,則實質上它指向0x34,0x12,0xXX,0xXX,後兩個字節是什麼數據,但從這個

語句上已經無從知道了。但看着一句,結果應該是0xXXXX1234。

這句話應該有很多種可能的。只討論windows吧,別的系統怎麼處理的,我不清楚。

win7 64位 + vs2010:

在debug版本中,VS會在每個數據之間填充0xCC,即int 3,這樣是爲了檢測緩衝區溢出的。

這種情況結果應改爲0xCCCC1234。

在release版本中,結果是0x24DD1234。這個結果在winxp sp3和win7 64專業上的一樣的結果

vc6:

0x70001234目前感覺這個東西和編譯環境關係很大,似乎沒有個確定值


  結論:這個程序的結果和編譯器關係很大,不同的編譯器會得出不同的結果。


水平有限,希望牛人指正。

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