关于内存地址和内存空间的理解。
1.内存地址用4位16进制和8位16进制表示的区别。例如经常可以看到某些书籍上写的内存地址0x0001,在另外一些书籍上写的内存地址又变成了0x00000001。都是表示的编号为1的内存地址,为什么一个是4位16进制表示,另外一个又是用8位16进制表示呢?
首先,必须要知道内存地址只是一个编号,代表一个内存空间。那么这个空间是多大呢?原来在计算机中存储器的容量是以字节为基本单位的。也就是说一个内存地址代表一个字节(8bit)的存储空间。
例如经常说32位的操作系统最多支持4GB的内存空间,也就是说CPU只能寻址2的32次方(4GB),注意这里的4GB是以Byte为单位的,不是bit。也就是说有4G=4*1024M(Byte)=4*1024*1024Kb(Byte)=4*1024*1024*1024bit(Byte),即2的32次方个8bit单位。
所以说用4位16进制表示的内存地址和用8位16进制表示的内存地址,其实都是代表一个8bit的存储空间而已:
至于说为什么会出现一种是用4位十六进制表示内存地址,另一种用8位十六进制表示内存地址,那是根据不同的硬件环境来的。个人理解:有些CPU只能寻址16位(16根地址线),所以用4位十六进制表示地址就够用了。有些CPU只能寻址32位(32根地址线),所以用8位十六进制。
另外记住, 210 = 1024
1G = 1024 M
1M = 1024 Kb
1Kb = 1024 bit
2.理解内存。
程序和数据平常存储在硬盘等存储器上,不管你开机或关机了,它们都是存在的,不会丢失。硬盘可以存储的东西很多,但其传输数据的速度较慢。所以需要运行程序或打开数据时,这些数据必须从硬盘等存储器上先传到另一种容量小但速度快得多的存储器,之后才送入CPU进行执行处理。这中间的存储器就是内存。
无论何种存储器,软盘、硬盘、光盘或者内存,都有地址。因为它们要存储数据,所以就必须按一定的单位的数据分配一个地址。有了地址,程序才能找到这些数据。这很好理解,想想你们家为什么要有门牌号即可。
学习编程,必须对内存的地址有一个透彻的理解。我们编程中的每一行代码,代码中用到的每个数据,都需要在内存上有其映射地址。当然,我们并不需要掌握内存是如何进行编址,那是计算机系中的另外一门课:操作系统的事了。
内存地址:
计算机把所有的信息都给数字化了,所以它知道自已把一个数据,一条命令记到了内存中的哪个(些)位置。
看下面的例子:
如果让计算机在内存里记住“丁小明”这个名字,可以示意为:
在第一行中,每一格表示一段内存,而格子里的内容是这段内容记下的数据;第二行中每一格内数字就是对应的内存的地址。
可能有人会啄磨:为什么一个“丁”字(“小”“明”两字也一样)占用两个内存地址呢?这是因为汉字在一个地址(位置)里呆不下,必须放在连续的两个地址空间内。那么,什么东西可以放在单独的一个内存地址里呢?像英文的里字母,比如’A’, 像阿拉伯数字:比如’1’,可以,而且就是放在一个内存地址里。假设有一字符串“ABC”,被记在内存里,可示意为(这次我们假设从内存地址2000H处记起):
现在我们提几个问题:
计算机记住”丁”字的内存地址是多少? 答案是:1000H。请见上图
我们一直在说,在计算机中,所有信息都被数字化为2进制的0、1,所以,“丁小明”这个名字被也应该是一串:0001 0010 0111 0101……,可是在中图所画出的,计算机内存里记的,仍是“丁小明”三个字啊。
下面是解释,我们只举一个字”丁”讲解。我们假设在那一串里的 0001 0010 0111 0101 对应的是 “丁” 字,那么有:
让我们把字母’A’对应的图也画出来:
在上面的两个图中:
第一行分别是“丁”和“A”,它是给人看的。
第二行则是一串的的0和1,这才是计算机内存中实际存储的数据。
第三行是内存的地址。并不是每个0和1所占的位置都被编上地址。而是每8个才拥有一个地址。
关于第三行,你可以这样理解,门牌号是一个家庭分配一个,每家每户内还有客厅卧室,这些就没有地址了。
可见:
‘丁’的确是由一串0、1组成的。更确切地,从图上可以看出‘丁’是由16位0和1组成。这16数都存放在2个内存地址里。
‘A’也一样,它是由8位0、1组成的。占1个内存地址。
总结:内存地址是内存当中存储数据的一个标识,并不是数据本身,通过内存地址可以找到内存当中存储的数据。