目录
- 1.什么是内存
- 2.内存的物理结构
- 3.内存的使用
- 4.数据在内存中为什么用二进制表示
- 5.二进制的补码
1.什么是内存
内存是与cpu沟通的桥梁,计算机中所有程序的运行都要依靠内存,内存对计算机的影响非常大,内存又被称为主存,作用就是存放cpu中的运算数据,以及与硬盘等外部存储设备交换的数据。cpu一般会把需要运算的数据调到主存中进行运算,运算完后cpu将结果再传出来。
2.内存的物理结构
内存内部由各种集成(IC)电路组成,它的种类很庞大,但是主要分为三种存储器:
-
随机存储器RAM:内存中最重要的一种,表示既可以从中读取数据,也可以写入数据,当机器关闭时,内存中的信息就会丢失。
-
只读存储器ROM:ROM一般只能用于数据的读取,不能写入,但是当机器停电时,这些数据不会丢失。
-
高速缓冲存储器Cache:它分为一级缓存(L1 Cache)、耳机缓存(L2 Cache)、三级缓存(L3 Cache)。这些数据位于内存和cpu之间,是一个读写速度比内存更快的存储器,当CPU向内存中写入数据时,这些数据也会被写入高速缓冲存储器中,当CPU再次需要读取这些数据时,会直接从告诉缓存中读取这些数据,如果Cache中没有,CPU会再去读内存中的数据。
-
一级缓存是离CPU最近的,由于一级缓存的技术难度和制造成本最高,提高容量所带来的技术难度增加和成本增加非常大,所带来的性能提升却不明显,所以一级缓存的容量是最小的。
-
一般来说,一级缓存可以分为一级数据缓存(Data Cache,D-Cache)和一级指令缓存(Instruction Cache,I-Cache)。二者分别用来存放数据以及对执行这些数据的指令进行即时解码,而且两者可以同时被CPU访问,减少了争用Cache所造成的冲突,提高了处理器效能。目前大多数CPU的一级数据缓存和一级指令缓存具有相同的容量。
下面是我用CPU-Z查看的我的电脑的高速缓存信息:
-
内存的IC元件上有地址信号、数据信号、电源信号、控制信号,通过引脚来传递这些信号,进行数据的读写。
-
数据信号的引脚数量决定每次可以输入输出的数据的多少,例如有8个数据线,表示,每次可以输入输出8bit的数据。
-
地址信号的引脚的数量决定了内存可以存放的数据,例如有10个地址线,表示,可以指定 2 10 2^{10} 210个地址,每个地址可以存放1个字节的数据。
-
内存读写数据都是以字节为单位的.
-
控制信号主要有WR,表示写信号,当其值为1时,表示写。RD,表示读信号,当其值为1时,表示读。
3.内存的使用
-
对于c语言,是通过指针去使用内存的,通过使用指针,可以对任意内存地址进行读写。
-
另外c语言中的数据类型所占的字节数都是整数,没有小数,这也是因为上面提到的数据在内存中以字节为单位进行读取。不同的数据类型具有不同 的字节数,这也决定了读取该种数据类型时,读取几个字节。
-
例如:数组再内存中是内存中连续排列的形式,而链表在内存中就不是连续排列的形式。
4.数据在内存中为什么用二进制表示
- IC的所有引脚只有两种电压:0v和有电压,这种特性决定了计算机的信息存储只能用0和1表示。
- 为什么一个字节等于8位,这是因为8位能够涵盖所有的字符编码。
- 我们所说的32位电脑以及64位的电脑,是指的计算机一次可以处理的数据位数,也就是数据线有32根和64根。
5.二进制的补码
例如对于39这个十进制数,表示成8位的二进制0010 0111,左移位一位,也就变成0100 1110,相当于扩大了2倍,按道理来说右移一位就相当于缩小为原来的1/2,就变成小数了,这怎么办?
通过上面这个小例子,我们也可以看出来直接使用原始的二进制码来表示数据,处理移位操作的时候会出现问题。下面介绍怎么解决这个问题:
- 首先二进制数中的负数,一般会把最高位当作符号位来使用。符号位是0表示正,1表示负。-1用二进制表示为1000 0001,+1的二进制数为0000 0001,最高位为符号位,二者相加的话,表示为1000 0010,这个答案显然是不正确的。
- 其实因为计算机无法进行减法运算,比如1-1,就是通过1+(-1)来实现的,所以在表示负数的时候要用到二进制补码,补码就是用正数来表示的负数。
- 补码的计算通过将除符号位外的各数位取反然后加1获得。例如:-1的二进制补码为:1000 0001 ->取反1111 1110->加1: 1111 1111。正数的补码等于原码。因此1+(-1)表示为0000 0001 + 1111 1111->0000 0000.
- 所以负数的二进制表示就是先求其补码,补码的求解过程就是对其原码除符号位外其余各位取反,然后加1
- 当计算结果为负的时候,计算结果的值也是以补码的形式出现的。补码变原码:符号位与最后一个1之间的所有数字按位取反.
- 对于c中int型数据占4个字节32位,取值的范围 − 2 31 至 2 31 − 1 -2^{31}至 2^{31}-1 −231至231−1,也就是-2147483648 - 2147483647 ,为什么是这样的结果就可以解释通了,最高位为符号位,因此具体数据占31位,0由于其符号位为0,所以归到了正数,即正数从0000 … 0000到0111 … 1111,负数在计算机内的补码从1000 … 0000到1111 … 1111,由于负数存的是补码,转为原码就是0000 … 0000到1000 … 0001,此时我们可以看出右端为-1,左端怎么是0,其实左端对应这个补码1000 … 0000,表示的是 − 2 31 -2^{31} −231,由于上面提到了0000 … 0000在计算机内表示的才是0。简单总结一句就是,32位数据,去掉符号位还剩31位,31位可以表示 2 31 − 1 2^{31}-1 231−1个数,0归到了正数的表示上,所以正数最大值比负数的最大值的绝对值少1。