Summary
1)浮点数在内存中的存储形式:
类型 | 符号位 | 指数 | 尾数 |
---|---|---|---|
float | 1位(第31位) | 8位(第23-30位) | 23位(第0-22位) |
double | 1位(第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
,指数为34. 指数+偏移
:3 + 127
= 130 <--> 1000 0010(float的指数占8位
)5. 尾数
:尾数局部为00001,占23位,有余的前面补0
:00001 0000 0000 0000 0000 006. 最终
:二进制为: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、浮点数在内存中的存储形式
类型 | 符号位 | 指数 | 尾数 |
---|---|---|---|
float | 1位(第31位) | 8位(第23-30位) | 23位(第0-22位) |
double | 1位(第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
,指数为34. 指数+偏移
:3 + 127
= 130 <--> 1000 0010(float的指数占8位
)5. 尾数
:尾数局部为00001,占23位,有余的前面补0
:00001 0000 0000 0000 0000 006. 最终
:二进制为: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语言进阶课程》。
如有错漏之处,恳请斧正。