C语言的数据类型——整数类型和浮点类型
??基本数据类型分为整数类型
和浮点类型
两大类。其中,整数类型又可以被细分成有符号整型
与无符号整型
。
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
以此类推。需要注意的是,对于(现如今主要是32/64位)。而对于long
比int
大的系统,应尽量使用int
以减少运行负担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 |
= 2541.M
= 1.11111111111111111111111(1.23个1)即M
= 2-2^(-23)
因此n
最大数值为[2-2^(-23)]×2^127 = 3.4028×10^38
??满足以下条件时数值最小
e
= 00000001即| E |
= 11.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] |