c语言 整数类型,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以此类推。需要注意的是,对于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第二章或查阅此文档

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值