看到論壇有人問一道題,說是曙光面試題。
#include void main()
這段**主要的問題就是把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,0***,0***,後兩個位元組是什麼資料,但從這個
語句上已經無從知道了。但看著一句,結果應該是0***xx1234。
這句話應該有很多種可能的。只討論windows吧,別的系統怎麼處理的,我不清楚。
win7 64位 +vs2010:
在debug版本中,vs會在每個資料之間填充0xcc,即int 3,這樣是為了檢測緩衝區溢位的。
這種情況結果應改為0xcccc1234。
在release版本中,結果是0x24dd1234。這個結果在winxp sp3和win7 64專業上的一樣的結果
vc6:
0x70001234目前感覺這個東西和編譯環境關係很大,似乎沒有個確定值
結論:這個程式的結果和編譯器關係很大,不同的編譯器會得出不同的結果。
水平有限,希望牛人指正。
計算機位元組順序
參考文章 參考文章 位元組順序是指佔記憶體多於乙個位元組型別的資料在記憶體中的存放順序,通常有小端 大端兩種位元組順序。小端位元組序指低位元組資料存放在記憶體低位址處,高位元組資料存放在記憶體高位址處 大端位元組序是高位元組資料存放在低位址處,低位元組資料存放在高位址處。基於x86平台的pc機是小端...
計算計算機位元組順序
problem write a function that determines whether a computer is big endian or little endian solution include using namespace std int is little endian b...
計算機中的位元組序問題
地點 基地 程式設計中的資料型別有很多事跨多個位元組的,比如char是用乙個位元組表示,而諸如int,float型別則用4個位元組表示double則用8個位元組表示,我們知道,資料物件例項是儲存在一定位址單元中的,我們也知道,儲存器中的每個位元組都由乙個唯一的位址標誌或者是儲存。那麼當資料物件跨多個...