程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 字符型數組在內存中的存儲

字符型數組在內存中的存儲

編輯:C++入門知識

[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。 這題雖然有點古怪,起碼自己編程是不會這樣寫的,但是通過仔細研究,卻了解了數據在內存中是怎樣存放的。重在過程。   以上全部是本人的膚淺了解,如有錯誤,歡迎指出。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved