当前位置: 首页 > news >正文

C 浮点数在计算机中如何存储

在计算机中采用科学记数法将浮点数分为下面三部分:

float 4个字节 32位 从高到低依次是:

31 30-23 22-0
符号位 0或1 指数位8位 小数部分23位

举例:十进制的小数20.1如何转成计算机中的存储形式(二进制)呢?

步骤:

  • 整数部分和小数部分分别转成二进制
    • 整数部分转二进制:除2取余,拿整数部分除2,每次操作记下余数,然后拿商继续除2,直到商为0;最后将每一步求得的余数倒叙排列。
    • 小数部分转二进制:乘2取整,拿小数部分即0.xxx乘2,每次操作结果留整数部分,接下来继续拿小数部分乘2,直到小数部分为0;最后将每步求得的整数部分正序排列。
  • 移位成标准的科学记数法,即:

\[a*10^b (1<=a<=10) \]

  • 让指数+127
  • 取小数部分位前23位,不足23位后面补0,超过23位只取前23位

实战:

第一步:分别将整数和小数部分转成二进制

对于20转二进制:

  • 20/2 商10 余0
  • 10/2 商5 余0
  • 5/2 商2 余1
  • 2/2 商1 余0
  • 1/2 商0 余1 🔚

所以二进制存储形式:10100

对于0.1转二进制

  • 0.1*2 得0.2 整数部分0 接下来拿小数部分0.2继续乘2
  • 0.2*2 得0.4 整数部分0 接下来拿小数部分0.4继续乘2
  • 0.4*2 得0.8 整数部分0 接下来拿小数部分0.8继续乘2
  • 0.8*2 得1.6 整数部分1 接下来拿小数部分0.6继续乘2
  • 0.6*2 得1.2 整数部分1 接下来拿小数部分0.2继续乘2
  • 0.2*2 得0.4 整数部分0 接下来拿小数部分0.4继续乘2
  • 0.4*2 得0.8 整数部分0 接下来拿小数部分0.8继续乘2
  • 0.8*2 得1.6 整数部分1 接下来拿小数部分0.6继续乘2
  • 0.6*2 得1.2 整数部分1 接下来拿小数部分0.2继续乘2
  • 0.2*2 得0.4 整数部分0 接下来拿小数部分0.4继续乘2
  • 0.4*2 得0.8 整数部分0 接下来拿小数部分0.8继续乘2
  • 0.8*2 得1.6 整数部分1 接下来拿小数部分0.6继续乘2
  • 0.6*2 得1.2 整数部分1 接下来拿小数部分0.2继续乘2
  • 0.2*2 得0.4 整数部分0 接下来拿小数部分0.4继续乘2
  • 0.4*2 得0.8 整数部分0 接下来拿小数部分0.8继续乘2
  • 0.8*2 得1.6 整数部分1 接下来拿小数部分0.6继续乘2
  • 0.6*2 得1.2 整数部分1 接下来拿小数部分0.2继续乘2
  • 0.2*2 得0.4 整数部分0 接下来拿小数部分0.4继续乘2
  • 0.4*2 得0.8 整数部分0 接下来拿小数部分0.8继续乘2
  • 0.8*2 得1.6 整数部分1 接下来拿小数部分0.6继续乘2
  • 0.6*2 得1.2 整数部分1 接下来拿小数部分0.2继续乘2
  • 0.2*2 得0.4 整数部分0 接下来拿小数部分0.4继续乘2
  • 0.4*2 得0.8 整数部分0 接下来拿小数部分0.8继续乘2
  • 0.8*2 得1.6 整数部分1 接下来拿小数部分0.6继续乘2
  • 0.6*2 得1.2 整数部分1 接下来拿小数部分0.2继续乘2
  • 可以看到已经开始无限循环了 下面的计算省略

所以0.1转成二进制,是一个无限循环小数,即:00011001100110011001100.....

第二步:移位成标准记数法

即:10100. 00011001100110011001100110011.... * 2^0

变成:1. 0100 00011001100110011001100110011...*2^4

第三步:指数部分处理

4+127=131 ,131转二进制,10000011

小数部分取前23位,不够的末尾补0,超出的截断--这也就是浮点数存在误差的由来

01000001100110011001101(最后这个1是四舍五入来的)

第四步:整合最后结果

0(符号位)10000011(指数位)01000001100110011001101(小数位)
0 10000011 01000001100110011001101

转换成16进制:

转换为十六进制(每 4 位一组):
0100 0001 1010 0000 1100 1100 1100 11010x41A0CCCD

在编译器中验证

image-20250809113926269

由于是小端存储,所以我们的计算结果其实是对的上的。关于大小端可以看我的这篇博客:C 大端存储与小端存储

参考:

在线进制转换工具

0.5转换成二进制

十进制小数转化为二进制小数

浮点数的十进制和二进制转换(详细例子解答)

http://www.gsyq.cn/news/36805.html

相关文章:

  • 2025年11月珠海酒店排行推荐:基于多维度数据对比分析
  • 2025年11月智能学习机品牌推荐榜单:五大品牌综合对比分析
  • C 如何判断当前系统使用的是大端还是小端存储
  • 2025年11月洗碗机品牌推荐榜单:权威评测与综合对比分析
  • faust基本表达式
  • 35.11跬步本手@【三赋百廿不唐娟】@20251101
  • C 如何判断当前系统使用的是大端还是小端
  • 2025年11月美国投资移民机构排行榜:全面评测与选择建议
  • 2025年11月GPU服务器厂商推荐排行:服务能力与成本效益综合评估
  • 2025年唐卡装饰权威深度解析推荐:家装资金托管模式与透明化服务机制剖析
  • 退役高二选手的CSP2025游记
  • 2025年唐卡装饰权威深度解析与推荐:家装资金安全与数字化服务新标杆
  • 2025年11月人形机器人落地商推荐榜:基于行业白皮书与权威数据的全面对比分析
  • 2025年11月人形机器人落地商推荐榜:基于行业白皮书与多维度数据的权威分析
  • 实践!Oracle 11g 数据库级别最佳参数优化
  • Oracle手工完全恢复的几种方式
  • 2025年11月膨润土厂家推荐榜单:权威测评与综合排名分析
  • Windows版本Oracle 11g一键巡检脚本
  • 力扣|二叉树|二叉搜索树最近节点查询|二叉搜索树中第k小元素
  • 2025 年 11 月保湿贴片面膜,修护贴片面膜,抗衰老贴片面膜厂家最新推荐,专业制造与品牌保障口碑之选
  • 2025 年 11 月美白贴片面膜,抗衰老贴片面膜,补水贴片面膜厂家最新推荐,高性能与可靠性兼具的优质品牌
  • 启动的时候出现错误 (exit code -1073741819 (0xc0000005) )?报错0xC0000005的可能原因?
  • .NET Framework 3.5安装失败?离线安装.NET Framework 3.5教程,附.NET Framework 3.5,4.5,4.8 等版本下载
  • vscode判断当前是否为debug模式
  • 2025 年 11 月烟酰胺精华液,修护精华液,保湿精华液厂家最新推荐,技术实力与市场口碑深度解析
  • 2025 年 11 月云南环保咨询,云南环评报告咨询,云南环评手续咨询最新推荐:精准检测与稳定性能深度解析
  • 2025 年 11 月云南环保咨询,云南环评报告咨询,云南环评手续咨询最新推荐:聚焦高端定制需求与全案交付能力
  • 2025年11月上海装修公司榜单:10强对比看服务与质保差异
  • 2025年11月上海装修公司综合榜:十家口碑排行深度评测
  • 深度学习基础理论————常见评价指标以及Loss Function - Big-Yellow