1 存储程序概念
50年代冯诺依曼提出了五大部件和存储程序概念,计算机由输入设备、存储器、控制器、运算器、输出设备组成,指令和数据可一起放在存储器,程序按顺序自动执行。
2 数据在内存中的存储
一个程序要运行,首先需要将程序的代码读入到内存,并根据数据的存储类别、作用区域在不同的内存区开辟数据空间,栈区的数据随着函数的调用及结构体和类的实例化不断开辟和回收空间。
下面以一个小的实例来说明数据在内存中的存储:
#include <stdio.h>
#include <conio.h>
void main()
{
bool bo[3];
printf("bool数据类型占%d个B:\n",sizeof(bool));
for(int i=0;i<3;i++)
{
bo[i]= true;
printf("bo+%d=%x\n", i,bo +i);
}
for(i=0;i<3;i++)
{
printf("bo[%d]=%d\n", i,bo+i);
}
printf("\n");
char charData[3] ={'a','b','c'};
printf("char数据类型占%d个B:\n",sizeof(char));
for(i=0;i<3;i++)
{
printf("charData+%d=%x\n", i,charData +i);
}
for(i=0;i<3;i++)
{
printf("charData[%d]=%c\n", i,charData[i]);
}
printf("\n");
short intData[3];
printf("short数据类型占%d个B:\n",sizeof(short));
for(i=0;i<3;i++)
{
intData[i]= i;
printf("intData+%d=%x\n", i,intData +i);
}
for(i=0;i<3;i++)
{
printf("intData[%d]=%d\n", i,intData[i]);
}
printf("\n");
float floatData[2] = {1.2, 3.4};
printf("float数据类型占%d个B:\n",sizeof(float));
for(i=0;i<2;i++)
{
printf("&*(floatData+%d)=%x\n", i,&*(floatData+i));
}
for(i=0;i<2;i++)
{
printf("*(floatData+%d)=%f\n", i,*(floatData+i));
}
printf("\n");
getch();
}
运算结果
bool数据类型占1个B:
bo+0=12ff44
bo+1=12ff45
bo+2=12ff46
bo[0]=1
bo[1]=1
bo[2]=1
char数据类型占1个B:
charData+0=12ff3c
charData+1=12ff3d
charData+2=12ff3e
charData[0]=a
charData[1]=b
charData[2]=c
short数据类型占2个B:
intData+0=12ff34
intData+1=12ff36
intData+2=12ff38
intData[0]=0
intData[1]=1
intData[2]=2
float数据类型占4个B:
&*(floatData+0)=12ff2c
&*(floatData+1)=12ff30
*(floatData+0)=1.200000
*(floatData+1)=3.400000
内存保存正在运行的程序代码和数据
内存的最小单元是bit,一个bit存储一个二进制位(B)。一般8个bit组成一个byte,若干个byte组成一个word
在一般的机器中,内存按字节编址,内存大小也是按字节计量
关机后,内存的数据全部丢失
3 数据层次
数字计算机处理的所有数据项最终都会被简化成0和1的组合。这是因为实现一个有两种稳定状态(一种代表0,一种代表1)的电子设备相对而言比较简单和经济。计算机实现的功能都是基于对0和1的基本操作。
计算机所支持的最小的数据项叫做位(bit,是二进制数(binary digit)的缩写,表示一个数字只能是两个值中的一个)。每个数据项或位,只允许取0或1。计算机电路可以实现各种简单的位操作,比如检查位的值,设置位的值,反转位的值(指将0转为1或1转为0)。
利用位这种低层形式的数据来进行编程是很麻烦的。更好的编程方法是处理类似十进制数字(0,1...9)、字母(A-Z,a-z)、特殊字符($,@,%,&,*,(,),-,+,",:,?,/等)这些形式的数据。数字、字母、特殊符号称做字符(character)。
所有在特定的计算机上用来编写程序及表示数据项的字符的集合称做计算机的字符集。因为计算机只能处理1和0,所有的字符在计算机中都被表示成1和0的组合。一个字节(byte)是由八位组成的。程序员利用字符创建程序和数据项;计算机使用位处理方式来操作和处理这些字符。
与字符是由位组成的相类似,字段(field)是由字符组成的。一个字段是表示某种有意义的信息的一组字符。
被计算机处理的数据项形成了一个数据层次。在数据层次中,我们从位开始,到字符、字段、记录、文件。通常一个记录(record)(可以在C++中表示为一个类)由数个字段(在C中称为数据成员)组成。
4 存储层次
计算机系统中存储层次可分为高速缓冲存储器、主存储器、辅助存储器三级。
由于储存速度,储存器各种类的造价问题,及储存器的容量问题,电脑就形成了以CPU内置高速Cache(最快最贵),内存(快速贵),硬盘(便宜容量大),为主的储存方式,而光碟,闪存是方便移动的储存器介质。
高速缓冲存储器用来改善主存储器与中央处理器的速度匹配问题。
辅助存储器用于扩大存储空,即硬盘,光盘等,容量大,但存取数据慢,计算机都是先把辅存中要读的东西放到主存后处理,然后在依据情况是否写回。
主存即为内存,断电信息丢失,但存取数据块,它的容量大小直接影响计算机运行速度。
执行的程序代码及涉及到的数据需要存储到内存才能由控制器调度,且涉及到的数据依次需进驻到高速缓存、寄存器,然后由运算器的逻辑电路的存储。