探寻float的表示范围

mac2026-09-29  3

C语言中的基本数据类型

字符类型 char 1字节 [-128,127] 无符号字符类型 unsigned char 1字节 [0,255] 短整数类型 short 2字节 [-32768,32767] unsigned short [0,65533] short int unsigned short int 整数类型 int 4字节 [-2^31,2^31 -1] unsigned int [0,2^32 -1] 长整数类型 long int 4字节/8字节 long unsigned long int 长长整数类型 long long int 8字节 单精度浮点类型 float 4字节 +-3.4*10^38 双精度浮点类型 double 8字节 +-1.78*10^308

同样是4个字节,为什么int和float表示的范围却有这么大的差异?

int -2147483648,2147483647 float +-3.4*10^38

int类型简单介绍下

32位无符号整数 , 其表示范围是2的32次方,最大整数为 2的32次方-1 有符号数则要去除一个符号位,其表示范围是[-2^31,2^31-1]

有符号数则要去除一个符号位,正数最大为2的31次方-1 , 负数最小为负 2的31次方 而float类型组成是由1个符号位 8个指数位 23个尾数位 1+8+23=32

0|1 8个指数位 -128,127 在这里计算一下float的取值是如何得出的 最大值0 127 .11111111...11111 先说小数部分,因为有23个小数位,所以最大的情况为23个1(0.1111111....1111111),即为1-2^-23 但是IEEE 754标准规定了一个隐含的1(用于节省1个位的空间),不在这23位中,所以整数部分有个1, 指数部分有8位,最大情况为0111 1111即127,所以float的最大表示为(1+(1-2^-23))*2^127, 化简得2^128 - 2^14 最小值 1 127 .11111...1111111 同理可得了 精度范围: 小数点后 6-7位 前5位肯定是精确的
最新回复(0)