內存分配與little-endian&big-endian
棧裏麵的內存地址分配是從大往小分配。即沒每次壓棧,棧頂指針-1(不一定是1,這個要根據數據類型來分配). 堆裏麵的數據地址分配是從小到大分配的,每次往堆裏麵壓如一個數,相應的地址要增加。
對於單字節變量來說,地址分配比較容易,即選擇一個沒有分配的地址給它。但是對於對字節變量來說,地址分配,則沒有單字節那麼容易理解: 首先說說little-endian和big-endian的概念
little-endian:數據地位字節放在低地址處,一次排列,數據高位字節放在高低地址處。
big-endian則剛剛相反。
有了這個了解,再來看看數據分配問題: 例如: unsigned short int s_int_data = 0x4142; 這裏很明顯,short int是2個字節的數據。那麼為了表示這個數據,s_int_data應該有一個地址,那麼,對於多地址數據來說,我們所說的地址就是該多字節數據的首地址,這個首地址應該是該數據所在空間中地址最小的一個,更詳細的說:假如給s_int_data分配的地址依次是 2001,2000,那麼這個首地址應該是2000。即s_int_data的地址為2000,那麼在這兩個字節中,數據的高位字節存放在2001,地位字節存放在2000. 而對於通常我們使用的x86構架的PC來說,都是little-endian類型的。
一下代碼可以更加詳細的說明這些理論:
#include "iostream" using namespace std; int main() { //int c_demo = 0; //int i_demo = 5; unsigned short int tow_byte = 0x4142;//高位字節存放的是字符串A,地位字節存放的是字符串B cout << "the low byte data is " << *(unsigned char *)&tow_byte<<endl; cout << "the high byte data is" << *((unsigned char *)&tow_byte +1)<<endl;//這裏是+1,並不像內存地址分配時從大到小的 cout << "the address of the data is = " << &tow_byte<<endl; //cout << "int address = " << &i_demo<<endl; return 0; }
版權申明:
轉載文章請注明原文出處https://blog.csdn.net/feiyinzilgd/archive/2010/12/21/6089413.aspx
最後更新:2017-04-02 06:51:33