Summary

1)浮点数在内存中的存储形式:

类型符号位指数尾数
float1位(第31位)8位(第23-30位)23位(第0-22位)
double1位(第63位)11位(第52-62位)52位(第0-51位)

2)float与double类型的数据在计算机外部的表示法是雷同的,然而因为所占存储空间大小的不同,其别离可能示意的数值范畴和精度不同

3)浮点数的转换
如:浮点数-8.25的二进制转换,float类型:
1. 符号位:1(正数)
2. 绝对值二进制:1000.01(整数局部的指数顺次为0,1,2...;正数局部的指数一次为-1,-2,-3...)
3. 迷信计数法:1.00001 * 23,指数为3
4. 指数+偏移:3 + 127 = 130 <--> 1000 0010(float的指数占8位
5. 尾数:尾数局部为00001,占23位,有余的前面补0:00001 0000 0000 0000 0000 00
6. 最终:二进制为:1 1000 0010 00001000000000000000000(符号位 + 指数 + 尾数);用16进制示意为:0xc1040000

留神

  • 对于float类型,指数的偏移为+127;对于double类型,指数的偏移为+1023。尾数局部,有余的位数前面补0
  • 通过如下指针形式,能够取得一段内存中的二进制位

    unsigned int* p = (unsigned int*)&val;printf("%08x", *p);   // %08x示意以16进制的模式来打印内存里的值

4)float能示意的具体数字的个数与int雷同(都占用4个字节,一共32个bit位,所以最多就232排列组合形式,即最多能示意232个数)

5)float的表示法是不准确的,所以能示意的范畴比int大。因为float的值不准确,所以对于一个float值,间接打印的数据可能有偏差;同时对于浮点数的运算,不能间接和0比拟

6)因为float的内存表示法比int简单,所以float的运算速度比int

浮点数的机密

1、浮点数在内存中的存储形式

类型符号位指数尾数
float1位(第31位)8位(第23-30位)23位(第0-22位)
double1位(第63位)11位(第52-62位)52位(第0-51位)

float与double类型的数据在计算机外部的表示法是雷同的,然而因为所占存储空间大小的不同,其别离可能示意的数值范畴和精度不同

2、浮点数的转换

如:浮点数-8.25的二进制转换,float类型:
1. 符号位:1(正数)
2. 绝对值二进制:1000.01(整数局部的指数顺次为0,1,2...;正数局部的指数一次为-1,-2,-3...)
3. 迷信计数法:1.00001 * 23,指数为3
4. 指数+偏移:3 + 127 = 130 <--> 1000 0010(float的指数占8位
5. 尾数:尾数局部为00001,占23位,有余的前面补0:00001 0000 0000 0000 0000 00
6. 最终:二进制为:1 1000 0010 00001000000000000000000(符号位 + 指数 + 尾数);用16进制示意为:0xc1040000

float f = -8.25f;  // f指明为float类型unsigned int* p = (unsigned int*)&f; // 用指针指向该浮点数的内存,并'以无符号整型数来示意'printf("0x%08X\n", *p); // %08X,示意以16进制大写的模式来打印值,通常'用来打印内存的二进制位'// 输入为:0xC104 0000,和笔算后果统一。

如果已知一个32位二进制示意一个浮点数,则推算后果和下面相同

3、浮点数深刻了解

int类型的范畴:[-231, 231-1]
float类型的范畴:[-3.4 x 1038, 3.4 x 1038]

问题:为什么int和float都占用4个字节的内存,而float却比int的范畴大的多呢?
解析:

  • float能示意的具体数字的个数与int雷同(都占用4个字节,一共32个bit位,所以最多就232排列组合形式,即最多能示意232个数)
  • float可示意的数字之间是不间断的,有间隙的
  • float只是一种近似的表示法,不能作为准确数来应用
  • 因为内存表示法绝对简单,float的运算速度比int慢的多

另:double和float的内存表示法是雷同的,所以也是不准确的。因为double占用的字节数比float多,所以double示意的精度比float高。

float f1 = 3.1415f;float f2 = 123456789;// 打印小数点后10位printf("%0.10f\n", f1);  // 3.1414999962printf("%0.10f\n", f2);  // 123456792.0000000000

本文总结自“狄泰软件学院”唐佐林老师《C语言进阶课程》。
如有错漏之处,恳请斧正。