32位和64位机数据类型的大小

转载:https://blog.csdn.net/baidu_37964071/article/details/81389259

32位系统和64位有什么区别?

通常的64位技术是相对32位而言的,这个位数指的是CPU GPRs(General-Purpose register通用寄存器)的数据宽度为64位,而32位的处理器的通用寄存器的数据宽度为32位,64位指令集就是运行64位数据的指令,也就是说一次可以运行64bit的数据。
也就是说:

  1. 64位CPU拥有更大的寻址能力,最大支持到16GB内存,而32bit只支持4G内存;
  2. 64位CPU一次可提取64位数据,比32位提高了一倍,理论上性能会提升1倍。但这是建立在64bit操作系统和64bit软件的基础之上。

我们来了解一下几个名词:

  1. 通用寄存器:可用于传送和暂存数据,也可以参与算术逻辑运算,并保存运算结果。通用寄存器的长度取决于机器字长。
  2. 字长:字长是CPU的主要技术指标之一,指的是CPU一次能并行处理的二进制的位数,字长是8的整倍数,通常的PC机的字长为16位,32位,64位。一台16位字长的PC机可以直接处理2^16(65536)之内的数字,对于超过此范围的数字需要分解的方法来处理。32位机比16位机优越的原因之一就在于它在一次操作中能处理的数字大,32位机字长的PC机能直接处理的数字为2^32(40亿),能处理的数字越大,则操作的次数就越少,从而系统的效率就越高。
  3. 寻址空间:指能处理的寻址范围,要看处理器的地址总线的位数,而不是它的字长。
    如Intel P4处理器字长为32位,地址总线也是32位。8086的数据总线为16位,地址总线为20位(则可寻址的内存空间为2^20=1MB)。64位处理器的数据总线为64位,地址总线大部分是32位。再看地址总线与寻址范围的关系,存储单元是以Byte为单位,N根地址总线能够访问2^N个存储单元,于是有32为地址总线可访问2^32个存储单元,即4GB。

为什么不同位数的操作系统指针大小不同

  明白了两个系统的寻址原理就能明白,32位与64位系统的寻址空间大小不同(寻址空间:https://jrhar.blog.csdn.net/article/details/78508795?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.control),大体就是这个原因。地址跟系统有关,但是基本数据类型占的大小是由C语言本身决定。

 

32位指针为什么是4个字节?

  所以指针为了正确指示内存中的地址,必须按照地址总线的宽度进行变量的存储,因此虽说64位CPU的数据宽度为64位而其地址总线一般不为64位(能访问的内存空间大的惊人,暂时估计应该还做不到),但是一般能超过32位,因此指针的长度大于4个字节(32位),所以64位机的指针字节为64位即8个字节,而32位机的地址总线一般为4个字节,即支持4GB的内存,则其指针的宽度为4个字节。

那么在不同的系统下什么数据类型大小会改变呢?

我们首先必须知道:
不同的平台上对不同数据类型分配的字节数是不同的,而平台是由处理器,操作系统及编译器才能决定的。
1. 64位处理器也可以装32位系统
2. 32位处理器上可以有16/32位的编译器
3. 即使是32位的编译器也可以有64位的整数(int64)

三者的长度可以不一样,但长度相等,比如32位的CPU+32位的OS+32位的Compiler,是最好的。

综上,虽然理论上来讲,数据类型的字节数应该是由CPU决定的,但实际上主要由编译器决定。

常用数据类型对应字节数

类型32位编译器64位编译器
char 1个字节 1个字节
char* 4个字节(32位的寻址空间是2^32, 即32个bit,也就是4个字节 8个字节(同理64位编译器)
short int 2个字节 2个字节
int 4个字节 4个字节
unsigned int 4个字节 4个字节
float 4个字节 4个字节
double 8个字节 8个字节
long 4个字节 8个字节
long long 8个字节 8个字节
unsigned long 4个字节 8个字节
posted @ 2021-01-28 19:25  adfas  阅读(1235)  评论(1编辑  收藏  举报