为什么32位是4G内存 为什么指针在32位系统中占4个字节

为什么32位是4G内存 为什么指针在32位系统中占4个字节

参考了很多大佬的和老师的文章  做点笔记 复习自用  路过的大佬看看就好 (●'◡'●)

1:在计算机系统的几个常见单位

1Pb = 1024Tb     1Tb = 1024Gb   1Gb = 1024Mb    1Mb = 1024Kb   1Kb = 1024Byte(字节)    1Byte(字节) = 8bit(比特)

bit是计算机存储的最小单位   计算机内存中对数据的存储使用二进制值表示的     一个bit位可以用二进制值0 或者1 也就是bit只有两种值  也就是0  或者1

所以一个bit位相当于一个存放一个二进制值0或者1的位置。

然后就是Byte    上述的每个单位的后面的b其实就是byte  一个byte等于8个bit  可以堪称  一个byte是由8个连续的bit位组成的

 

为什么32位是4G内存 为什么指针在32位系统中占4个字节_第1张图片

 

 

如上所示    因为每一个bit是由0或者1 组成的  又因为1个byte等于8个bit, 就相当于有2^8 = 256种组合  分别是:

0000 0000

0000 0001

0000 0010

.

.

.

1111 1111 (也就是255 1*2^7 + 1*2^6+1*2^5.......1*2^1+1*2^0 = 255)

范围从0 - 255 也就是0——2^8-1  备注:这也是为什么IP地址最大只到255的原因 因为一个IP地址只占一个字节 寻址范围就是0——255  

如上二进制值用十六进制表示的话 也就是

0x00 (0000 0000)

0x01 (0000 0001)

0x02 (0000 0010)

.

.

.

0xFF (1111 1111)

(因为一个十六进制等于4个二进制) 

 

2:CPU和内存的关系

计算机中可以将数据存储到以下位置:寄存器 (register)、硬盘、内存、高速缓存

高速缓存和寄存器的出现是因为当内存的处理速度跟不上,CPU的处理速度的时候 而生产出来的。 CPU从高速缓存或者寄存器中取得数据的时候 速度更快

 

因为CPU无法通过硬盘直接读取数据  所以硬盘的数据只能发送到内存中, 然后CPU在通过地址总线、数据总线、控制总线对内存中的数据进行传输和操作

CPU通过地址总线 找到该数据  通过控制总线了解到该数据是读操作还是写操作  然后通过数据总线将数据从内存中读取到CPU或者是从CPU发送到内存中

地址总线的宽度绝对了CPU的寻址范围(这也是后面讲到的32位系统和64位系统的寻址范围的区别)    数据总线的宽度决定了单次传输的传输数量 也就是速度 

 控制总线的宽度决定了CPU对其他硬盘的控制能力和方式

所以内存才是计算机系统的主存储器

 

为什么32位是4G内存 为什么指针在32位系统中占4个字节_第2张图片

3:内存的基本结构

数据在内存也是以0和1 表示  但是我们知道内存中数据是海量的  那么CPU需要寻找某个地址的数据 那么是怎么寻找的 

在内存中  这样规定 每8个bit就组成一个单位 也就是一个字节, CPU每次只能访问一个byte  而不能单独去访问一个byte里面的某个bit  也就是说 一个byte是CPU中最小的IO单位

 

为什么32位是4G内存 为什么指针在32位系统中占4个字节_第3张图片

如上所示   因为有了以字节为最小单位的划分  所以每个数据会根据数据的类型存放在内存中 ,因而每种数据占用的字节大小也是不同的

 

4:引入内存地址的概念

即使我们把内存分成了以字节为单位的结构, 但是实际上内存里还是有非常多的字节的,例如64MB内存就有 64 × 1024 × 1024 个字节啊!

如果cpu要查找1个变量, 还是要1个个字节去找到话...还是很浪费时间的行为,所以为了避免去遍历内存,计算机系统就引入了内存地址这个概念。

     举个例子, 内存就是一栋大楼,  而内存里每1个字节就是大楼的每个房间, 而内存地址就是房间的门牌号码了. 如果没有门牌号码,我们去访问某个住在大楼的人是十分苦难的, 只能从1楼开始每个房间去敲门.. 如果那个人住在顶楼你就悲剧了. 而如果你知道那个人的门牌号码, 就可以直接上去敲他的门, 实在是方便很多啊.

内存也一样, 计算机操作系统会给内存每1个字节分配1个内存地址, cpu只需要知道某个数据类型的地址编号, 就可以直接去到该地址编号的内存位置去提取数据了

 

5:直接寻址的优化

以往  给到一个内存地址  CPU需要从到到尾的寻址 一直到该地址  如果内存中数据量过大的话 该寻址操作也是一个很费时间的工作 所以后来有了直接寻址 也就是说得到该地址  CPU就能直接从海量的地址单元中直接跳转到该单元的地址编号 从而读取到该数据

 

6:内存地址的表达方式

CPU中存在地址线 地址线一旦通电就能产生电信号,因为通过只产生正电和负电,每根地址线产生的信号无非就是1或者0, 然后把电信号转换成数字信号 产生的二进制序列就是编号 那么这个编号就是地址编号,

跟门牌号一样, 其实内存地址也是由1个2进制数字来表示的.    每1个地址对应内存里的1个byte字节, 如果地址的值加1, 那么这个地址就对应下1个字节了. 

内存地址的长度 (根据操作系统的不同  二进制数值的个数也不同) 在32位系统中 内存地址的长度就是32位的二进制数表示   64位中就是64位的二进制数表示

因为32位系统中地址的长度是32  所以32位系统中内存地址的范围就是从

0000 0000 0000 0000 0000 0000 0000 0000

0000 0000 0000 0000 0000 0000 0000 0001

0000 0000 0000 0000 0000 0000 0000 0010

.

.

1111 1111  1111 1111  1111 1111  1111 1111   

十六进制表示也就是0x00000000——0xFFFFFFFF

这也是32位系统最大的寻址范围就是 Ox00000000 ~ OxFFFFFFFF 也就是0——2^32-1

64位同理(内存地址的长度用64个二进制值表示 寻址范围是0——2^64-1)

 

7:内存地址的数量决定CPU能访问的内存大小

从第六点可以得到 因为32位系统中地址的数量是2^32个  2的32次方个地址就相当于有2的32次方个字节单元   进行换算后也就是2^32/1024/1024/1024 = 4GB  也就是我们常说的, 32位系统最大的支持的内存是4G 

所以如果给32位系统加上内存条  是没有意义的 因为操作系统也用不到该内存条  64位也是同理

(我们平常所说的32位 或者64位 其实是计算机CPU中通用寄存器一次性处理、传输、暂时存储的信息的最大长度。即CPU在单位时间内(同一时间)能一次处理的二进制数的位数。)

所以对于指针来说 其实也就说的通了  在32位系统中  因为地址是用32个二进制值表示(也就是4字节) 寻址范围是0-2^32-1 为了避免地址存不下的问题 所以在32位系统中指针的大小就统一用4字节表示, 这样能覆盖到最大的寻址范围。同时 当32位系统指针指向char 类型 int类型 double类型等其他类型的的时候 指向的都是首地址

如下图所示

为什么32位是4G内存 为什么指针在32位系统中占4个字节_第4张图片

 

64位系统中需要8个字节 解释同理可得

 

 

 

你可能感兴趣的:(自用复习,c语言,操作系统)