1. CPU位数
CPU位数=CPU中寄存器的位数=CPU能够一次并行处理的数据宽度(位数)=数据总线宽度;现在的计算机处理器一般都是64位,这是硬件的事。
查看CPU位数:右键点击桌面上的“此电脑”图标,然后在弹出的菜单中点击“属性”菜单项。
2. 操作系统位数
指令集:
CPU为了实现其功能设计了指令集,即是CPU的全部指令,这是机器语言。计算机的所有功能都是基于CPU的指令集。指令集和CPU的位数是有联系的。如Intel 8086 CPU 是16位,其指令集也是16位。如Intel 80386DX CPU 是32位,其指令集也是32位,但它也保持原16位指令集,这是为了向上兼容。有64位CPU上运行32位操作系统、32位CPU上运行16位操作系统的情况,也是为了向上兼容。
操作系统位数 = 其所依赖的指令集位数 <= CPU位数
3. 机器字长
电脑技术中对CPU在单位时间内(同一时间)能一次处理的二进制数的位数叫字长。
4. 编译器位数
编译器位数对数据类型长度的影响:
1、有影响,但是很小。这个影响在不同的编译器是不同的。
微软的CL只有32位,对,只有32位,但是它能编译x64,所以对于CL来说,编译器的位数没有意义。编译的目标代码指针位宽取决于参数是指定x86还是x64.gcc和clang,编译器本身的位宽决定不加特别参数指定,默认编译的目标代码的指针位宽跟编译器本身位宽相同。但是,如果你编译编译器的时候允许了multilib,那么你还可以通过m32或者m64之类的参数来决定输出的目标代码的位宽是32还是64。总结一下就是,只影响不指定处理器参数的默认生成的目标代码的位数。
2、数据类型取决于编译器。
有人觉得,类似于wchar_t这种基本也算是标准类型了,在Linux上是32位在windows上是16位,这不是操作系统相关吗?但是你要想啊,决定这个到头来还是编译器啊。你看我在windows上能编译Linux运行的程序,在Linux上也能编译Windows运行的程序。甚至我还能编译arm、arm64、mips、misp64等等的,所以跟编译器的运行环境没关系。跟你的目标才有关系。
作者:Pluto Hades
链接:https://www.zhihu.com/question/41801362/answer/92399285
来源:知乎
5. 数据类型长度
C标准中并没有具体给出规定那个基本类型应该是多少字节数,而且这个也与机器、OS、编译器有关,比如同样是在32bits的操作系统下,VC++的编译器下int类型为占4个字节;而tuborC编译器下则是2个字节。
所以int,long int,short int的宽度都可能随编译器而异。但有几条铁定的原则(ANSI/ISO制订的):
- sizeof(short int)<=sizeof(int)
- sizeof(int)<=sizeof(long int)
- short int至少应为16位(2字节)
- long int 至少应为32位(4字节)
经WinXP和Win7 64位系统测试,应该跟系统没关系,而是跟CPU位数+编译器的平台有关系,两台电脑都是64位CPU,所以结果是一样的,同一类型的有符号和无符号长度一样,只不过值的范围不一样。
数据类型 | 字节数(16位编译器) | 字节数(32位编译器) | 字节数(64位编译器) | 总结 |
---|---|---|---|---|
char | 1 | 1 | 1 | char一直占用1个字节 |
char* | 2 | 4 | 8 | char* 是指针位宽,N位系统含有N个位,占用N/8个字节 |
short | 2 | 2 | 2 | short一直占用2个字节 |
int | 2 | 4 | 4 | int在x86和x64都是4个字节 |
unsigned int | 2 | 4 | 4 | 无符号int与int本身的占位一样,不区分编译器 |
long | 4 | 4 | 8 | long一直等同于float |
long long | 8 | 8 | 8 | long long一直等同于double |
float | 4 | 4 | 8 | float由于带浮点至少需要4字节,在x64编译器里是8字节 |
double | 8 | 8 | 8 | double一直占8个字节 |
6. 参考资料
https://www.cnblogs.com/chakyu/p/7405275.html
https://blog.csdn.net/Bigcat_u/article/details/82821326