内存地址与内存空间

概览

  1. 基本概念
  2. 进入误区
  3. 误区诊断
  4. 总结

基本概念

  • 什么是位?    
  • 什么是字节?

    位表示的是二进制位,一般称为比特,即0或1,是计算机存储的最小单位;

    字节是计算机中数据处理的基本单位;

    计算机中以字节为单位存储和解 释信息,规定一个字节由八个二进制位构成,即1个字节等于8个比特。

                      1Byte=8bit

  • 地址总线?

  

  (1)CPU是通过地址总线来指定存储单元的。

  (2)地址总线决定了cpu所能访问的最大内存空间的大小。

  (3)地址总线是地址线数量之和。

  • 内存地址?

    是一种用于软件及硬件等不同层级中的数据概念,用来访问电脑主存中的数据。

        

    内存地址只是一个编号,代表一个内存空间

  • 寻址空间

    寻址空间一般指的是CPU对于内存寻址的能力。通俗地说,就是能最多用到多少内存的一个问题。数据在存储器(RAM)中存放是有规律的 ,CPU在运算的时候需要把数据提取出来就需要知道数据存放在哪里 ,这时候就需要挨家挨户的找,这就叫做寻址,但如果地址太多超出了CPU的能力范围,CPU就无法找到数据了。 CPU最大能查找多大范围的地址叫做寻址能力 ,CPU的寻址能力以字节为单位 ,如32位寻址的CPU可以寻址2的32次方大小的地址也就是4G,这也是为什么32位的CPU最大能搭配4G内存的原因 ,再多的话CPU就找不到了。

误区时刻

   前方高能,请谨慎驾驶!接下来进入“误区时刻”,什么鬼?

  

  不着急,我们慢慢往下看,跟着我的思路,落入我的陷阱!哈哈....

      

  按照上图,8位的cpu地址总线的宽度是8,即8位占1字节;16位cpu地址总线的宽度为20(cpu内部有个加法计算器,将16位宽度通过加法计算器加到20位),即16位占2字节;32位的cpu地址总线宽度为32,即32位占4字节。有没有问题???好,没有问题我们继续!

  地址总线宽度为8,可以表示多少个地址呢?2^8=256个,这么多地址那么所占内存为256 * 1(所占字节)= 256Byte;对不对?好,继续;

  地址总线宽度为20,可以表示多少地址呢?2^20=65536个,这么多地址所占内存为65536 * 2(所占字节) = 2M;

  地址总线宽度为32,可以表示多少地址呢?2^32=65536个,这么多地址所占内存为65536 * 4(所占字节) = 16G;

  

  有没有问题?好,我们看下官方的数据;

    Intel公司早期的CPU产品的地址总线和地址寄存器的宽度为20位,即CPU的寻址能力为2^20=1024*1024字节=1024K字节=1M字节;286的地址总线和地址寄存器的宽度为24位,CPU的寻址能力为2^24=1024*4*1024*4B=4*1024*4KB=16M;386及386以上的地址总线和地址寄存器的宽度为32位,CPU的寻址能力为2^32=4096M字节=4G字节。

  是不是要上天?16G的内存!!!

  

  哪里的问题?

  接下来,我们来找找误区。

误区诊断

  来看看开头基本概念这里【内存地址只是一个编号,代表一个内存空间】。什么意思?

  我们这块内存空间存储的是什么?是这个编号吗?

  显然不是,而是这个编号代表这块空间,这款空间会随编号的位数改变吗?变成2个字节,4个字节?大错特错!一个内存地址所代表的永远是1个字节,内存的每一个字节都有为一个个编号,16位,32位只是这个编号的长短,不会影响内存的最小单元大小,仅仅是个编号。唯一影响的是所能表示的个数。

  所以这个16位的cpu,所有表示的地址个数是2^20 = 1048576个,一个地址所指大小1个字节 ,也就是1M;

  32位的cpu,所有表示的地址个数是2^32 = 4294967296个,一个地址所指大小1个字节 ,也就是4G;

总结

  内存地址只是一个编号,代表一个内存空间;

  内存地址所执行的内存单元大小就是1字节,跟内存地址位数无关;

  内存空间大小就是寻址能力,即能访问到多少个地址

原文地址:https://www.cnblogs.com/Lanht/p/10780364.html

时间: 2024-10-15 04:25:46

内存地址与内存空间的相关文章

关于内存地址和内存空间的理解。

1.内存地址用4位16进制和8位16进制表示的区别.例如经常可以看到某些书籍上写的内存地址0x0001,在另外一些书籍上写的内存地址又变成了0x00000001.都是表示的编号为1的内存地址,为什么一个是4位16进制表示,另外一个又是用8位16进制表示呢? 首先,必须要知道内存地址只是一个编号,代表一个内存空间.那么这个空间是多大呢?原来在计算机中存储器的容量是以字节为基本单位的.也就是说一个内存地址代表一个字节(8bit)的存储空间. 例如经常说32位的操作系统最多支持4GB的内存空间,也就是

内存地址和内存空间

转自:http://www.cnblogs.com/VIPler/p/4282584.html 1. 内存地址用4位16进制和8位16进制表示的区别.例如经常可以看到某些书籍上写的内存地址0x0001,在另外一些书籍上写的内存地址又变成了0x00000001.都是表示的编号为1的内存地址,为什么一个是4位16进制表示,另外一个又是用8位16进制表示呢? 首先,必须要知道内存地址只是一个编号,代表一个内存空间.那么这个空间是多大呢?原来在计算机中存储器的容量是以字节为基本单位的.也就是说一个内存地

Android For JNI(二)——C语言中的数据类型,输出,输入函数以及操作内存地址,内存修改器

Android For JNI(二)--C语言中的数据类型,输出,输入函数以及操作内存地址,内存修改器 当我们把Hello World写完之后,我们就可以迈入C的大门了,今天就来讲讲基本的一些数据类型,函数之内的 我们先来看一张传播久远的图片' 一.各种数据类型介绍 整型 整形包括短整型.整形和长整形. 短整形 short a=1; 整形 一般占4个字节(32位),最高位代表符号,0表示正数,1表示负数,取值范围是-2147483648~2147483647,在内存中的存储顺序是地位在前.高位在

内存和内存地址

1.内存地址用4位16进制和8位16进制表示的区别.例如经常可以看到某些书籍上写的内存地址0x0001,在另外一些书籍上写的内存地址又变成了0x00000001.都是表示的编号为1的内存地址,为什么一个是4位16进制表示,另外一个又是用8位16进制表示呢? 首先,必须要知道内存地址只是一个编号,代表一个内存空间.那么这个空间是多大呢?原来在计算机中存储器的容量是以字节为基本单位的.也就是说一个内存地址代表一个字节(8bit)的存储空间. 例如经常说32位的操作系统最多支持4GB的内存空间,也就是

JVM的堆内存和栈内存中存储的数值或类型的区别在哪里

基本类型变量的值和内容是一致的引用类型变量的值在堆内存,赋值的内容是一个地址,这个地址也在栈内存,指向堆内存引用类型变量的值是内存地址,内存地址在栈内存,指向堆:内容是实例,在堆内存 引用类型变量时,栈内存存储的是指向堆的内存地址,真正数据在堆内存中,栈内存中存的是指向堆的地址,占用8个字节 类里面方法外的是成员方法跟属性(property),如果属性没有static修饰就是在堆,有即为静态属性(类属性)就不在,即在永久区,所有对象公用一份:eg:int i = 4,这个4 在栈内存 ,i是一个

LMA(装载内存地址)与VMA(虚拟内存地址)

      关于LMA和VMA,这个问题,有点点小复杂,不过,此处,我会把我的理解,尽量通过通俗的方式解释出来,以方便理解.当然,鄙人水平有限,难免有错,希望各位批评指正.       一般提及LMA和VMA,多数情况都是和ld,链接器相关的.在了解这两个名词的详细含义之前,有些基本知识和前提要说一下: [基础知识] 1.从你写的源代码到执行你的程序,一般经历了这几个过程:源代码编辑 -> 编译 -> 链接 -> 装载 -> 执行 2.编译,简单说就是用编译工具,将你的源码,变成可

C语言精要总结-内存地址对齐与struct大小判断篇

在笔试时,经常会遇到结构体大小的问题,实际就是在考内存地址对齐.在实际开发中,如果一个结构体会在内存中高频地分配创建,那么掌握内存地址对齐规则,通过简单地自定义对齐方式,或者调整结构体成员的顺序,可以有效地减少内存使用.另外,一些不用边界对齐.可以在任何地址(包括奇数地址)引用任何数据类型的的机器,不在本文讨论范围之内. 什么是地址对齐 计算机读取或者写入存储器地址时,一般以字(因系统而异,32位系统为4个字节)大小(N)的块来执行操作.数据对齐就是将数据存储区的首地址对齐字大小(N)的某个整数

11.用C对32位内存地址的访问方式

使用一个32位处理器,要对一个32位的内存地址进行访问,可以这样定义 #define RAM_ADDR     (*(volatile unsigned long *)0x0000555F)     然后就可以用C语言对这个内存地址进行读写操作了     读:tmp = RAM_ADDR:     写:RAM_ADDR = 0x55: 定义volatile是因为它的值可能会改变,大家都知道为什么改变了: 如果在一个循环操作中需要不停地判断一个内存数据,例如要等待RAM_ADDR的I标志位置位,因

程序内存地址的分配

程序的内存分为四个部分: 代码区 全局栈 堆 局部栈 代码区存放执行代码,以及一些全局常量,宏定义等内容. 全局栈存放着全局静态变量. 局部静态变量存放在局部栈中. malloc,new等对象存放在堆当中. 堆的本质上是一种连表结构,里面存放着分配的空间,下一个分配空间的地址,上一个分配空间的地址,以及分配空间的大小. new 和 malloc的关系. malloc new new[] free  delete delete[] realloc calloc new[] new在执行malloc