zoukankan      html  css  js  c++  java
  • 内存详解

    2009-06-04

    计算机存储单位以及内存原理

    计算机的存储单位:
    计算机系统数据只用0和1这种表现形式,(这里只表示一个数据点,不是数字),一个0或者1占一个“位”,而系统中规定8个位为一个字节。

    电脑的各种存储器的最小的存储单位是比特,也就是位(bit,简称b),它表示一个二进制位。比位大的单位是字节(byte,简称B),它等于8个二进制位。

    因为在存储器中含有大量的存储单元,每个存储单元可以存放8个二进制位,所以存储器的容量是以字节为基本单位的。

    每个英文字母要占一个字节,一个汉字要占两个字节。

    其它常用的单位还有千字节(Kilobyte,简称K或者KB,1KB等于1024B)、兆字节(Megabyte,简称M或者MB,1MB等于1024KB)和吉字节(Gigabyte,简称G或者GB,1GB等于1024MB)。

    说道字节肯定要提到字符,那么这两者之间又是怎么回事呢?

    字符:
    人们使用的记号,抽象意义上的一个符号。如 '1', '中', 'a', '$', '¥', ……

    字节:
    计算机中存储数据的单元,一个8位的二进制数,是一个很具体的存储空间。如 0x01, 0x45, 0xFA, ……

    区别:通过编码,具体把某一个字符编码成了哪几个字节,我们只需要知道“编码”的概念就是把“字符”转化成“字节”。也就是说,字符是通过字节来实现的。

    内存:
    程序和数据平常存储在硬盘等存储器上,不管你开机或关机了,它们都是存在的,不会丢失。硬盘可以存储的东西很多,但其传输数据的速度较慢。所以需要运行程序或打开数据时,这些数据必须从硬盘等存储器上先传到另一种容量小但速度快得多的存储器,之后才送入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个内存地址。

    总结:内存地址是内存当中存储数据的一个标识,并不是数据本身,通过内存地址可以找到内存当中存储的数据。

  • 相关阅读:
    Day 20 初识面向对象
    Day 16 常用模块
    Day 15 正则表达式 re模块
    D14 模块 导入模块 开发目录规范
    Day 13 迭代器,生成器,内置函数
    Day 12 递归,二分算法,推导式,匿名函数
    Day 11 闭包函数.装饰器
    D10 函数(二) 嵌套,命名空间作用域
    D09 函数(一) 返回值,参数
    Day 07 Day08 字符编码与文件处理
  • 原文地址:https://www.cnblogs.com/kevinkim/p/1674329.html
Copyright © 2011-2022 走看看