深入C语言—前奏—内存中的数据

来源:互联网 发布:数据挖掘apriori算法 编辑:程序博客网 时间:2024/05/29 18:02

1,、广义上的内存

2、内存间的对比

3、内存中的数据

4、数据宽度

5、内存中数据的溢出

6、内存中的正负数

1.1

计算机当中,我们的内存是一个比较广义的内容,可以储存数据的都统称为内存。内存又可以分为ROM和RAM,也可以分为CPU的内存和内存条的内存等等。然而在我们编程的时候只需要知道,我们所控制的一个内存或者说我们所使用的一个内存是一个逻辑上同一的内存,比如说内存条里的内存和显卡上的显存在物理上是互相独立的,但是在我们编程时,所有的内存在一起的。

在我们使用编程时,我们就把内存理解为两部分,一:CPU内的一些寄存器,二:内存条上的内存。

2.1

上面我们知道广义的内存分为寄存器和内存,他们之间还是有些不同的,在数字电路中我们了解了寄存器和ROM,他们究竟有什么不同。接下来我们来大概的说一说。在CPU的内部有许多寄存器,而内存是通过总线接口连接到CPU的。所以说寄存器在CPU内部,内存在CPU外部,所以交换信息时寄存器的速度要快得多。再者就是说寄存器和内存相比,数量非常少,所以我们可以给寄存器命名,方便我们认识使用,而内存非常多,不方便命名,但是为了使用方便,我们给每个内存一个编号,通过这个独一无二的标识去使用。

3.1

在电路里我们知道一个电器元件是有自己的电气特性,通常来说是一个连续性的,比如说一个小灯泡的电流或电压值。在数字电路中,我们更为方便的把我们的所认识的电压用0和1这种电平来表示,所以在数字电路中,我们不再用电压的概念,统统都是电平。所以这时一个电子元器件的端口只能是高低电平两种状态的一种。我们的计算机就是一个数字电路的产物,内部都是数字电路和寄存器,所以它只认识高低电平,也就是说它只能存储0和1。所以说内存中的数据只有0和1两种。

4.1

在我们日常生活中,一个数据可以没有宽度的,比如说一个很大的数,10亿,我们可以用科学计数法很简洁的表示出来,写出来,储存到我们的本子上。但是计算机就不同了,我们已经知道计算机内存中的数据只能是0和1,但是一系列0和1的组合可以描述我们计算机的一切,比如一个音频文件,一个游戏在内存都是0和1的组合。但是我们的内存是没有大小,可是储存无限大的数据嘛,答案是不可以。我们的内存分为寄存器和内存,寄存器生产时,已经固定了它的数据宽度,就是说它可以存放多少个二进制数字,比如说一个8位的寄存器,它只能存储8个二进制的0或1。内存呢,它也是有大小的,存储一个二进制位的容量大小是1BIT,存储八个二进制位的容量是1byte,另外还有半字和字的内存容量单位。

5.1

我们已经知道了内存是有大小的,那么超过了本身可以存储的最大数值怎么办,答案是溢出,溢出的结果是回到了0,接着加。我们来举一个例子。比如说一个32位的寄存器EAX,它的值是0XFFFFFFFF,EAX+1的结果就因为超过了最大数值,所以发生溢出,所以回到了0。我们再来看回到0后接着加是什么意思。还是刚才的EAX,里面的值不变,这次我加的是2,那结果是EAX+2=EAX+1+1=0+1=1。从计算机的本质上讲就是超过的内容保存不了,只能保存这一数据宽度的数据。

6.1

内存中是没有正负数的,计算机也不认识负数,它的内存中的数据只有0和1。正负数是我们人为规定的,我们规定一块内存中最高位表示符号位,1代表负数,0代表正数,其实一块有特定数据宽度的内存,最高位是1时,它正好是这个内存可以储存的二进制组合的中间一个组合。比如一个8位的内存,无符号数来说最大储存的是0xff(255- 11111111),对有符号数来说最大的正数是0x7f(127,01111111)。我们可以知道无符号时存了256个数,而有了符号只有128个,所有有符号数其实是把内存可以表示的二 进制组合分成了两半,一半代表正数,一半代表负数,其实这个正负数是通过编译器决定的,内存并不知道(我认为)


原创粉丝点击