您的位置:首页 > 其它

内存分配与little-endian&big-endian

2010-12-21 14:30 281 查看
内存分配与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;

}










版权申明:
转载文章请注明原文出处http://blog.csdn.net/feiyinzilgd/archive/2010/12/21/6089413.aspx

并请联系谭海燕本人或者前往谭海燕个人主页留言
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: