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的数据。
也就是说:
- 64位CPU拥有更大的寻址能力,最大支持到16GB内存,而32bit只支持4G内存;
- 64位CPU一次可提取64位数据,比32位提高了一倍,理论上性能会提升1倍。但这是建立在64bit操作系统和64bit软件的基础之上。
我们来了解一下几个名词:
- 通用寄存器:可用于传送和暂存数据,也可以参与算术逻辑运算,并保存运算结果。通用寄存器的长度取决于机器字长。
- 字长:字长是CPU的主要技术指标之一,指的是CPU一次能并行处理的二进制的位数,字长是8的整倍数,通常的PC机的字长为16位,32位,64位。一台16位字长的PC机可以直接处理2^16(65536)之内的数字,对于超过此范围的数字需要分解的方法来处理。32位机比16位机优越的原因之一就在于它在一次操作中能处理的数字大,32位机字长的PC机能直接处理的数字为2^32(40亿),能处理的数字越大,则操作的次数就越少,从而系统的效率就越高。
- 寻址空间:指能处理的寻址范围,要看处理器的地址总线的位数,而不是它的字长。
如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个字节 |