内存中的浮点数
-
浮点数在内存中的存储方式为:符号位,指数,尾数
类型 符号位 指数 尾数 float 1位(第31位) 8位(第23-30位) 23位(第0-222位) double 1位(第63位) 11位(第52-62位) 52位(第0-51位) -
float
与double
类型的数据在计算机内部的表示法是相同的,但由于所占存储空间 的不同,其分别能够表示的数值范围和精度不同。
浮点数存储示例
-
浮点数的转换
-
将浮点数转换成二进制
-
用科学计数法表示二进制浮点数
-
计算指数偏移后的指
-
注意:计算指数时,需要加上偏移量,偏移量的值与类型有关
如:对于指数6,偏移后的指如下:
float
:127+6 -> 133double
:1023+6 -> 1029
-
-
示例:实数8.25在内存中的
float
表示- 8.25的二进制表示:1000.01 -> 1.00001*(2^3)
- 符号位:0
- 指数:127+3 ->130 -> 1000 0010
- 小数:00001
- 内存中8.25的
float
表示为:0 10000010 00001000000000000000000 -> 0x41040000
#include <stdio.h> int main() { float f = 8.25; unsigned int* p = (unsigned int*)&f; //%08x为整型以16进制方式输出的格式字符串,会把后续对应参数的整型数字,以16进制输出。08的含义为,输出的16进制值占8位,不足部分左侧补0。 printf("0x%08X ", *p); return 0; } //输出结果: 0x41040000
int 和 float 表示的范围
-
int
类型的范围:([-2^{31},2^{31}-1]) -
float
类型的范围:([-3.4*10^{38},3.4*10^{38}]) -
int
和float
都占4个字节的内存,为什么float
却比int
的范围大得多?float
能表示的具体数字的个数与int
相同float
可表示的数字之间不是连续的,存在间隙float
只是一种近似的表示法,不能作为精确数使用- 由于内存表示法相对复杂,
float
的运算速度比int
慢得多
#include <stdio.h> int main() { float f = 3.1415f; float f1 = 123456789; printf("%0.10f ", f); printf("%0.10f ", f1); return 0; } //输出结果: 3.1414999962 123456792.0000000000