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位机下,intshort int占16位,long int占32位,而在32位机中int也变成了32位,具体见下表。

整型16位编译器32位编译器64位编译器
char111
short int161616
int163232
long int323264
long long int326464

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以此类推。需要注意的是,对于longint大的系统,应尽量使用int以减少运行负担(现如今主要是32/64位)。而对于longint相同的系统,应使用long类型以保证向下支持。

2.浮点类型

??浮点类型使用一种类似于科学计数法的方式,去表示包括小数在内更大范围的数据,可以分为floatdoublelong 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第二章或查阅此文档

相关推荐