在 C/C++ 中,浮点数可以使用 float
、double
或 long double
来表示。这些浮点数类型都是按 IEEE 754 标准实现的,其在内存中的存储方式如下:
-
float
占用 4 个字节(32 位),其中最高位表示符号位,接下来的 8 位表示指数部分,剩余的 23 位表示尾数部分。其中指数部分采用偏置指数表示法,即将真实指数加上一个固定的值(127)后再表示。例如,一个浮点数 2.5 在内存中按照单精度浮点数存储方式为0 10000000 01000000000000000000000
,其中符号位为 0 表示正数,偏置指数部分为 10000000(二进制),表示指数部分为 2,尾数部分为 1.0。 -
double
占用 8 个字节(64 位),其中最高位表示符号位,接下来的 11 位表示指数部分,剩余的 52 位表示尾数部分。其内存存储方式与单精度浮点数相似,只是指数部分的偏置值变为 1023。 -
long double
的内存存储方式与双精度浮点数类似,根据不同的编译器实现和操作系统,其占用的字节数可以不同,通常为 80 位或 128 位。
需要注意的是,在浮点数运算中,由于浮点数采用二进制表示,因此在进行浮点数运算时可能存在精度误差,例如 0.1 + 0.2
的结果可能不等于 0.3
,这是由于浮点数的小数点不是对齐的二进制小数点导致的。针对浮点数精度问题,可以采用一些小技巧来进行处理,例如使用 IEEE 754 的舍入规则、适当增加精度等。
-----------------------------------------------------------------------------------------------------------------------------
示例代码如下:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main(int argc,char argv[])
{
//浮点数在内存中的存储
//类型 float、double、long double
//整型家族类型,表示范围:limits.h
//浮点数表示范围:float.h
//整型存储,以浮点型形式拿
int n = 9;
float* pFloat = (float*)&n;
printf("n的值为:%d\n",n);//9
printf("*pFloat的值为:%f\n", *pFloat);//0.000000
//浮点型存储,以整型形式拿
*pFloat = 9.0;
printf("n的值为:%d\n", n);//1091567616
printf("*pFloat的值为:%f\n", *pFloat);//9.000000
//浮点数V可以这样表示V=(-1)^X×M×2^E
//5.5-10进制的浮点数---->转换成---->101.1-2进制的浮点数---->1.011*2^2
//V=(-1)^X×M×2^E
//V=(-1)^0×1.011×2^2
//9.0-10进制的浮点数---->转换成---->1001.0-2进制的浮点数---->1.001*2^3
//float 32位 S:(-1)^X 1位 M:23 E:8
// E要修正+127
// X E M
// 0 10000001 01100000000000000000000
// 0x40b00000
//double 64位 S:(-1)^X 1位 M: 52 E:11
// M要修正+1023(同理)
//--------------------存储------------------------
//读E不全0
//E要修正+127
//M要修正+1023(同理)
//读E全0
//1-127
//1-1023
//读E全1
//表示正负无穷大
return 0;
}