基本数据类型分为整数类型和浮点类型两大类。其中,整数类型又可以被细分成有符号整型与无符号整型。
1.整数类型
有符号整型
short int
int
long int
long long int
char(使用整数存储字符)
无符号整型
unsigned short int
unsigned int
unsigned long int
unsigned long long int
unsigned char(使用整数存储字符)
其中,后面的类型不能小于前面的类型,即short int占用的空间可能等于int但不会大于它,或者long int可能等于或大于int占用的空间。举个例子,16位机下,int和short int占16位,long int占32位,而在32位机中int也变成了32位,具体见下表。
整型
16位编译器
32位编译器
64位编译器
char
1
1
1
short int
16
16
16
int
16
32
32
long int
32
32
64
long long int
32
64
64
32/64位编译器下各种整型的取值范围:
| ------ | :------: | :------: |
| 整型 | 十进制范围 | 对应二进制 |
| short int | [-32767, 32767] | 1/0 15个1 |
| int | [-2147483647, 2147483647] | 1/0 31个1 ||
| long int 32| [-2147483647, 2147483647] | 1/0 31个1|
| long int 64| [-9223372036854775807, 9223372036854775807] |1/0 63个1|
| long long int | [-9223372036854775807, 9223372036854775807] |1/0 63个1|
| unsigned short int | [0, 65535] |1/0 16个1|
| unsigned int | [0, 4294967295] |1/0 32个1|
| unsigned long int 32 | [0, 4294967295] |1/0 32个1|
| unsigned long int 64 | [0, 18446744073709551615] |1/0 64个1|
| unsigned long long int | [0, 18446744073709551615] |1/0 64个1|
因此,类型使用顺序是short-unsigned short-int-unsigned int以此类推。需要注意的是,对于long比int大的系统,应尽量使用int以减少运行负担(现如今主要是32/64位)。而对于long和int相同的系统,应使用long类型以保证向下支持。
2.浮点类型
浮点类型使用一种类似于科学计数法的方式,去表示包括小数在内更大范围的数据,可以分为float,double和long double,IEEE浮点标准用一种特殊的计数法去表示一个数n:
n = (-1)^{s} × m × 2^{e}
s即sign,为了表示该数的正负而引入,当s = 1时为负数,0位非负数
e为比例因子的指数,称为浮点数的指数
e = | E | - Bias
E表示阶码,为二进制,| E |表示二进制数对应的十进制数,Bias为偏置数
m = | 1.M |
M是一个二进制小数,规定尾数第二位加小数点为m,取值范围是[1, 2)或[0, 1)
以单精度float为例,该类型占用32位空间,其中第32位(N31)为符号位,N30-N23位为8位指数位,N22-N0位为23位的尾数位。
举个例子,存在一个浮点数float n = 15213.0
转化为二进制N = 11101101101101 = 1.1101101101101 × 2^13(小数点左移13位)
则1.M = 1.1101101101101
frac = 11011011011010000000000
e = 13
又因为Bias = 127
所以| E | = 140
E = 10001100
因此浮点表示法:
0 10001100 1011011011010000000000
那么,如何求解浮点类型的取值范围?同样以32位的float为例,根据上面已经可以推出:
n = (-1)^{s} × m × 2^{| E | - 127}
满足以下条件时数值最大
E = 11111110即| E | = 254
1.M = 1.11111111111111111111111(1.23个1)即m = 2-2^(-23)
因此n最大数值为[2-2^(-23)]×2^127 = 3.4028×10^38
满足以下条件时数值最小
E = 00000001即| E | = 1
1.M = 1.00000000000000000000001即m = 1+2^(-23)
因此n最小数值为[1+2^(-23)]×2^(-126) = 1.1755×10^(-38)
因此求出浮点类型的取值范围:
| ------ | :------: | :------: |
| 浮点型 | 位数 | 取值范围 |
| float | 32| [-3.4028×10^38,-1.1755×10^(-38)] ∪ [1.1755×10^(-38),3.4028×10^38] |
| double | 64 | [-1.7977×10^308,-2.2250×10^(-308)] ∪ [2.2250×10^(-308),1.7977×10^308] |
*进一步了解IEEE 754可查阅CSAPP第二章或查阅此文档