1 基本概念
- 位 (bit):代表0或1, 比如 0000,代表4位,00001111代表8位。位是内存的基本单元。
- 字节 (byte):通常1B=8bit (字节的含义依赖于系统实现)。字节是描述计算机内存量的度量单位。
- 字长(word size):CPU在单位时间内能一次处理的二进制数的位数。
- 32位CPU:该CPU在单位时间内能一次处理的二进制数的位数为32位,即一次处理4个字节。
- 64位CPU:该CPU在单位时间内能一次处理的二进制数的位数为64位,即一次处理8个字节。
- 32位操作系统:为了32位电脑(32位CPU)而设计的操作系统,同时需要安装32位软件以发挥32位(x86)的最佳性能。
- 64位操作系统:为了64位电脑(64位CPU)而设计的操作系统,同时需要安装64位软件以发挥64位(x64)的最佳性能。
64位系统和32位系统有什么区别?
1、64bit CPU拥有更大的寻址能力,最大支持到16GB内存,而32bit只支持4G内存;
2、64位CPU一次可提取64位数据,比32位提高一倍。理论上性能会提升1倍,但要以64bit操作系统+64bit软件为基础。
2 数据范围
不同的平台上对不同数据类型分配的字节数是不同的。
个人对平台的理解是CPU+OS+Compiler,是因为:
1、64位机器也可以装32位系统(x64装XP);
2、32位机器上可以有16/32位的编译器(XP上有tc是16位的,其他常见的是32位的);
3、即使是32位的编译器也可以弄出64位的integer来(int64)。
以上这些是基于常见的wintel平台,加上我们可能很少机会接触的其它平台(其它的CPU和OS),所以个人认为所谓平台的概念是三者的组合。
虽然三者的长度可以不一样,但显然相互配合(即长度相等,32位的CPU+32位的OS+32位的Compiler)发挥的能量最大。
理论上来讲数据类型的字节数应该是由CPU决定的,但是实际上主要由编译器决定(占多少位由编译器在编译期间说了算)。
常用数据类型对应字节数
可用如sizeof(char),sizeof(char*)等得出
32位编译器:
char :1个字节
char*(即指针变量): 4个字节(32位的寻址空间是2^32, 即32个bit,也就是4个字节。64位编译器同理)
short int : 2个字节
int: 4个字节
unsigned int : 4个字节
float: 4个字节
double: 8个字节
long: 4个字节
long long: 8个字节
unsigned long: 4个字节
64位编译器:
char :1个字节
char*(即指针变量): 8个字节
short int : 2个字节
int: 4个字节
unsigned int : 4个字节
float: 4个字节
double: 8个字节
long: 8个字节
long long: 8个字节
unsigned long: 8个字节
3 边界值
- int类型的最高位为符号位,若最高位为0, 则为非负数,若最高位为1,则为负数。
- 32位系统中int类型占4个字节(C中int类型是32位的),范围是-2147483648~2147483647(
~
):
1、最大值为INT_MAX:或者0x7FFFFFFF。
2、最小值为INT_MIN:或者0x80000000。
3、-1(int类型)在4个字节中的存储方式为0xFFFFFFFF。
对于:
=
+ 0,
是负数从小到大排序的第0位;
对于-1: -1 = +
,-1是负数从小到大排序的第
-1位。
- 注意,比较有趣的是:
INT_MAX + 1 = INT_MIN
INT_MIN - 1 = INT_MAX
abs(INT_MIN) = INT_MIN
INT_MAX + 1 < INT_MAX, INT_MIN - 1 > INT_MIN, abs(INT_MIN) < 0.
- 所有超过限值的数,都会出现溢出,使程序出现warning,但是并不会出现error。如果想表示的整数超过了该限值,可以使用长整型long long 占8字节64位。
1、最轻微的上溢是INT_MAX + 1:结果是 INT_MIN。
2、最严重的上溢是INT_MAX + INT_MAX:结果是-2。
3、最轻微的下溢是INT_MIN - 1:结果是INT_MAX。
4、最严重的下溢是INT_MIN + INT_MIN:结果是0 。
参考文献
[1] 32位和64位的区别. Bird鸟人.
[2] 32位和64位系统区别及int字节数. weixin_30432007.
[3] 32位和64位系统下 int、char、long、double所占的内存. single6.
[4] C++ INT_MAX、INT_MIN、0x80000000以及int中负数的存储. boom!!!.
[5] C/C++整型上下限INT_MAX INT_MIN及其运算. zhusf16.
[6] INT_MAX和INT_MIN注意事项. 对称.