[cpp] #include <stdio.h> int main (void) { union b { short k; //測試環境short占2字節 char i[2]; //測試環境char占1字節 }*s,a; s=&a; s->i[0]=0x41; s->i[1]=0x52; printf("%x\n",s->k); return 0; } 今天做題做了一道很怪異的題目,下面是代碼,大家可以先猜一下答案。 本人一開始認為運行結果應該為 4152 ,但是在VS2008運行得出的結果竟然是 5241,咦,奇怪,怎麼會反過來了呢? 經過一番測試,搜索。發現這個問題涉及到數據在內存存儲的問題,也就是字節序的問題(點我查看更多關於字節序的介紹),原來在大部分的機器裡面存儲字符型數組是在內存中是按照從低位到高位的存儲的,就是“0x41”放在內存的低位,“0x52”放到內存的高位,從數組的角度講就是i[0]存到最低端,然後從低到高一直存。也就是下表的順序 0x52 0x41 數據在內存中的存儲都是二進制的,而且是八位一個字節的。所以i[2]在內存中實際存儲為 01010010 01000001 由於在共用體裡面只能是多選一的,所以變量k的值也是上表一模一樣的。轉換成16進制數就是 5241 。 這段程序一開始的運行結果容易給人一種假象,就是這段代碼把2個數顛倒輸出的,其實輸出的數就是個“0101001001000001”轉化而成的16進制數5241。 這題雖然有點古怪,起碼自己編程是不會這樣寫的,但是通過仔細研究,卻了解了數據在內存中是怎樣存放的。重在過程。 以上全部是本人的膚淺了解,如有錯誤,歡迎指出。