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

内存分配与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

并请联系谭海燕本人或者前往谭海燕个人主页留言

时间: 2024-08-01 00:25:31

内存分配与little-endian&amp;big-endian的相关文章

大端和小端(Big endian and Little endian)

一.大端和小端的问题 对于整型.长整型等数据类型,Big endian 认为第一个字节是最高位字节(按照从低地址到高地址的顺序存放数据的高位字节到低位字节):而 Little endian 则相反,它认为第一个字节是最低位字节(按照从低地址到高地址的顺序存放据的低位字节到高位字节). 例如,假设从内存地址 0x0000 开始有以下数据:   0x0000         0x0001       0x0002       0x0003   0x12            0x34        

关于Big Endian 和 Little Endian

原文:http://graykeel.iteye.com/blog/995193#comments 一.字节序 来自:http://ayazh.gjjblog.com/archives/1058846/ 谈到字节序的问题,必然牵涉到两大CPU派系.那就是Motorola的PowerPC系列CPU和Intel的x86系列CPU.PowerPC系列采用big endian方式存储数据,而x86系列则采用little endian方式存储数据.那么究竟什么是big endian,什么又是little

为什么不能再构造函数中执行大量的内存分配、文件读写等复杂操作??

问题描述 为什么不能再构造函数中执行大量的内存分配.文件读写等复杂操作?? 大婶们啊:为什么不能再构造函数中执行大量的内存分配.文件读写等复杂操作??? 解决方案 可以啊!谁告诉你不行的? 只是在构造函数做太复杂的操作,当出错时发现错误有时会很困难.特别是定义为全局变量时,程序还没有运行.就出错了. 解决方案二: 构造函数主要进行一些初始化工作,复杂的工作放到成员函数中处理,这样比较符合OOP设计 解决方案三: 以牺牲对象分配的时间来换取代码的简单行· 是可以的·! 但是不推荐 解决方案四: 这

关于Java 数组内存分配一点认识

 可能Java 数组大家都很熟悉,最近我遇到了一个关于Java 数组内存分配的问题.         呵呵.突然就发现许多书上"基本数据类型存储在栈内存当中,对象则保存在堆内存"这句话完全是错误的.下面是个简单的例子代码: public class Test { public static void main(String[] argv) { // 静态初始化数组 String[] names = { "Michael", "Orson", &q

Linux内核中常见内存分配函数(三)

ioremap void * ioremap (unsigned long offset, unsigned long size) ioremap是一种更直接的内存"分配"方式,使用时直接指定物理起始地址和需要分配内存的大小,然后将该段 物理地址映射到内核地址空间.ioremap用到的物理地址空间都是事先确定的,和上面的几种内存 分配方式并不太一样,并不是分配一段新的物理内存. ioremap多用于设备驱动,可以让CPU直接访问外部设备的IO空间.ioremap能映射的内存由原有的物理

《unix设备驱动》内存分配

这里只简单介绍一下内核中提供的一些内存管理接口,方便内核开发入门人员对内存管理有一个大致的了解,也方便自己以后复习   Kmalloc   分配的区域在物理内存中式连续的 函数原型:void * kmalloc(size_t size ,int flags)不同的标志可以以不同的方式控制kmalloc的行为 比如是内核内存的分配还是用户空间内存分配,分配过程中是否可以休眠等等   内核把内存分为三个区段: 可用于DMA的内存 常规内存 高端内存   物理内存只能按照页面进行分配 只能分配一些预定

VC6下使用STL注意:不要让内存分配失败导致您的旧版STL 应用程序崩溃

大多数 C++ 开发人员在他们的代码中都广泛使用了标准模块库 (STL).如果您是其中的一员,并且正在直接使用即装即用的 STL 和 Visual C++ 6.0,则在内存不足的条件下,您的应用程序就处于崩溃的高度危险的状况下.产生此问题的原因是,检查运算符 new 是否失败是一种非常少见的做法.更糟糕的是,当 new 确实失败时,响应不是标准的.有些语言编译器返回 NULL,而其他语言则引发异常. 另外,如果您正在 MFC 项目中使用 STL,要注意 MFC 有其自己的规则集.本文将讨论这些问

new-正在学c++, class内存分配的问题

问题描述 正在学c++, class内存分配的问题 重载 Matrix& Matrix::operator-(const Matrix &m) { if (m.row_n != row_n||m.column_n != column_n) { std::cout << "Size not matching, can't add!" << std::endl; std::cout << "the left is returne

RAMCloud:内存云存储的内存分配机制

现在全闪存阵列已经见怪不怪了,EMC的XtremIO,还有VNX- F(Rockies),IBM FlashSystem.全闪存真正为效率而生,重新定义存储速度.凭借极致性能,高可用性,为您极大提高企业级应用效率.提到闪存的优势,那么毋庸置疑的就是速度!而在速度优势背后,SSD则面临着价格.容量以及寿命等方面的限制. 当然随着技术的发展,成本的下降,SSD有可能会取代机械硬盘,成为下一代企业存储的主要介质.机械硬盘可能转变为磁带的角色. 但是,闪存速度的确就是现在存储系统的极限吗?现在有需要基于

解析操作系统的内存分配(malloc)对齐策略

问题: 我们在写程序的时候经常发现程序使用的内存往往比我们申请的多,为了优化程序的内存占用,搅尽脑汁想要优化内存占用,可是发现自己的代码也无从优化了,怎么办?现在我们把我们的焦点放到malloc上,毕竟我们向系统申请的内存都是通过它完成了,不了解他,也就不能彻底的优化内存占用. 来个小例子 //g++ -o malloc_addr_vec mallc_addr_vec.cpp 编译 #include<iostream> using namespace std; int main(int arg