C/C++浮点数在内存中的存储

在 C/C++ 中,浮点数可以使用 floatdouble 或 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;
}

  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

代码巨匠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值