指针的长度是多少呢?由什么决定呢?

版权声明:欢迎转载请注明转自方辰昱的博客https://blog.csdn.net/viafcccy https://blog.csdn.net/viafcccy/article/details/84337359

首先,介绍几个基本概念:

  1、字长:在同一时间中处理二进制数的位数叫字长。通常称处理字长为8位数据的CPU叫8位CPU,32位CPU就是在同一时间内处理字长为32位的二进制数据。二进制的每一个0或1是组成二进制的最小单位,称为一个比特(bit)。

   一般说来,计算机在同一时间内处理的一组二进制数称为一个计算机的“字”,而这组二进制数的位数就是“字长”。字长与计算机的功能和用途有很大的关系, 是计算机的一个重要技术指标。字长直接反映了一台计算机的计算精度,为适应不同的要求及协调运算精度和硬件造价间的关系,大多数计算机均支持变字长运算, 即机内可实现半字长、全字长(或单字长)和双倍字长运算。在其他指标相同时,字长越大计算机的处理数据的速度就越快。早期的微机字长一般是8位和16 位,386以及更高的处理器大多是32位。目前市面上的计算机的处理器大部分已达到64位。

  字长由微处理器(CPU)对外数据通路的数据总线条数决定。

  2、最小可寻址单位:内存的最小可寻址单位通常都是字节。也就是说一个指针地址值可对应内存中一个字节的空间

  3、寻址空间:寻址空间一般指的是CPU对于内存寻址的能力。CPU最大能查找多大范围的地址叫做寻址能力 ,CPU的寻址能力以字节为单位 (字节是最小可寻址单位),如32位寻址的CPU可以寻址2的32次方大小的地址也就是4G,这也是为什么32位寻址的CPU最大能搭配4G内存的原因 ,再多的话CPU就找不到了。

  这里CPU的寻址位数是由地址总线的位数决定,32位CPU的寻址位数不一定是32位,因为32位CPU中32的意义为字长。

  有关寻址范围计算解释,对于32位寻址的CPU,其地址值为32位的二进制数,所以可以表示的最大地址为2的32次方(即4G,最大内存空间为4GB,这里G表示数量、GB表示容量)。同时我们不难看出,一个指针的值就是一个32位的二进制数,32位对应4字节(Byte)。所以,指针的大小实际上是由CPU的寻址位数决定,而不是字长。

 再来分析一下如下的情况:

  32位处理器上32位操作系统的32位编译器,指针大小4字节。
  32位处理器上32位操作系统的16位编译器,指针大小2字节。  
  32位处理器上16位操作系统的16位编译器,指针大小2字节。
  16位处理器上16位操作系统的16位编译器,指针大小2字节。

  这从结果看起来指针的大小和编译器有关??

  实际不是这样的,有这样的结果是因为以上几种情况,处理器当前运行模式的寻址位数是不一样的,如下:

  Intel 32位处理器32位运行模式,逻辑寻址位数32,指针也就是32位,即4个字节
  Intel 32位处理器16位虚拟机运行模式,逻辑寻址位数16,指针也就是16位,即2个字节

  编译器的作用是根据目标硬件(即CPU)的特性将源程序编译为可在该硬件上运行的目标文件。如果一个编译器支持某32位的CPU,那么它就可以将源程序编译为可以在该CPU上运行的目标文件。该源程序中指针大小也会被编译器根据该CPU的寻址位数(如32位)编译选择为4字节。

  综上可得:

  指针大小是由当前CPU运行模式的寻址位数决定!

转自:https://www.cnblogs.com/noble/p/4144167.html

指针是多少位只要看地址总线的位数就行了。80386以后的机子都是32的数据总线。所以指针的位数就是4个字节了。

这里介绍地址总线

地址总线 (Address Bus;又称:位址总线) 属于一种电脑总线 (一部份),是由CPU 或有DMA 能力的单元,用来沟通这些单元想要存取(读取/写入)电脑内存元件/地方的实体位址。

地址总线Address Bus)是一种计算机总线,是CPU或有DMA能力的单元,用来沟通这些单元想要访问(读取/写入)计算机内存组件/地方的物理地址。 [1] 

数据总线的宽度,随可寻址的内存组件大小而变,决定有多少的内存可以被访问。取个例子,一个16位宽度的地址总线(通常在1970年和1980年早期的8位处理器中使用)到达2的16次方 = 65536 = 64KB的内存地址,而一个32位地址总线(通常在像现今2004年的PC处理器中)可以寻址到4,294,967,296 = 4GiB的地址。 [1] 

在大多数的微计算机中,可寻址的组件都是8位的"字节"(所以"K"在这情况像相等于"KB"或kilobyte),有很多的计算机例子是以更大的数据区块当作他们实体上最小的可寻址组件,像是大型主机、超级计算机以及某些工作站的CPU。 [1] 

地址总线AB是专门用来传送地址的,由于地址只能从CPU传向外部存储器或I/O端口,所以地址总线总是单向三态的,这与数据总线不同。地址总线的位数决定了CPU可直接寻址内存空间大小,比如8位微机的地址总线为16位,则其最大可寻址空间为2^16=64KB,16位微型机的地址总线为20位,其可寻址空间为2^20=1MB。一般来说,若地址总线为n位,则可寻址空间为2^n位。 [1] 

地址总线的宽度,随可寻址内存元件大小而变,决定有多少的内存可以被存取。 [1] 

举例来说:一个 16位元 宽度的位址总线 (通常在 1970年 和 1980年早期的 8位元处理器中使用) 到达 2 的 16 次方 = 65536 = 64 KB 的内存位址,而一个 32位单元位址总线 (通常在像现今 2004年 的 PC 处理器中) 可以寻址到 4,294,967,296 = 4 GB 的位址。但现在很多计算机内存已经大于4G(windows XP x32位系统最大只能识别3.29G,所以要使用4G以上大内存就要用windows x64位系统)。所以目前主流的计算机都是64位的处理器也就是说可以寻址到2^64=16X10^18=16EB的位址,在很长一段时间内这个数字是用不完的。 [1] 

在大多数的微电脑中,可寻址的元件都是 8 位元的 "字节" (所以 "K" 在这情况像相等于 "KB" 或 kilobyte),有很多的电脑例子是以更大的资料区块当作他们实体上最小的可寻址元件,像是大型主机超级电脑、以及某些工作站的CPU。

更多关于地址总线的内容可以直接看 

https://baike.baidu.com/item/%E5%9C%B0%E5%9D%80%E6%80%BB%E7%BA%BF/4307936?fr=aladdin

猜你喜欢

转载自blog.csdn.net/viafcccy/article/details/84337359