浮点数在计算机中存储方式、十六进制(HEX)和浮点类型(float、double)转换

2023-11-17

浮点数在计算机中存储方式

https://www.cnblogs.com/king1302217/archive/2010/12/06/1897770.html

C语言和C#语言中,对于浮点类型的数据采用单精度类型(float)和双精度类型(double)来存储,float数据占用32bit,double数据占用64bit,例如申明变量double a=120.5,计算机是怎么存储120.5这个数的呢?

其实不论是float还是double在存储方式上都是遵从IEEE的规范的,float遵从的是IEEE R32.24 ,而double 遵从的是R64.53。

无论是单精度还是双精度在存储中都分为三个部分:

  • 符号位(Sign) : 0代表正,1代表为负

  • 指数位(Exponent):用于存储科学计数法中的指数数据,并且采用移位存储

  • 尾数部分(Mantissa):尾数部分

其中单精度float的存储方式如下图所示:

在这里插入图片描述

而双精度double的存储方式为:

在这里插入图片描述

R32.24和R64.53的存储方式都是用科学计数法来存储数据的,比如8.25用十进制的科学计数法表示就为:8.25 * 100,120.5可以表示为:1.205 * 10-2,0.075可以表示为:7.5 * 10-2

计算机不认识十进制的数据,他只认识0,1,所以在计算机存储中,首先要将上面的数更改为二进制的科学计数法表示,8.25用二进制表示可表示为1000.01,120.5用二进制表示为:1110110.1;0.075用二进制表示为0.0001:(转换方法查看进制转换 )

用二进制的科学计数法表示1000.01可以表示为1.0001 * 23,1110110.1可以表示为1.1101101 * 26,0.0001可以表示为1.0 * 2-4;任何一个数都的科学计数法表示都为1.xxx * 2N,尾数部分就可以表示为xxxx,第一位都是1,可以将小数点前面的1省略,所以对于float型,23bit的尾数部分,可以表示的精度却变成了24bit,道理就是在这里,那24bit能精确到小数点后几位呢,我们知道9的二进制表示为1001,所以4bit能精确十进制中的1位小数点,24bit就能使float能精确到小数点后 6位,而对于指数部分,因为指数可正可负,8位的指数位能表示的指数范围就应该为:-127-128了,所以指数部分的存储采用移位存储,存储的数据为元数据+127,例如N=3时,指数部分位130。

举例:8.25和120.5在内存中真正的存储方式

首先看下8.25,用二进制的科学计数法表示为:1.0001 * 23

按照上面的存储方式,符号位为:0,表示为正,指数位为:3+127=130,故8.25的存储方式如下图所示:

在这里插入图片描述

而单精度浮点数120.5的存储方式如下图所示:

在这里插入图片描述

那么如果给出内存中一段数据,并且告诉你是单精度存储的话,你如何知道该数据的十进制数值呢?其实就是对上面的反推过程,比如给出如下内存数据:0100001011101101000000000000,首先我们先将该数据分段,0 10000 0101 110 1101 0000 0000 0000 0000,在内存中的存储就为下图所示:

在这里插入图片描述

根据我们的计算方式,可以计算出,这样一组数据表示为:1.1101101 * 26=120.5

而双精度浮点数的存储和单精度的存储大同小异,不同的是指数部分和尾数部分的位数(双精度浮点数的指数部分元数据为1023,尾数部分为52位),这里不再详细的介绍双精度的存储方式了,只将120.5的最后存储方式图给出,大家可以仔细想想为何是这样子的

在这里插入图片描述

下面我就这个基础知识点来解决一个我们的一个疑惑,请看下面一段程序,注意观察输出结果

float f = 2.2f;
double d = (double)f;
Console.WriteLine(d.ToString("0.0000000000000"));
f = 2.25f;
d = (double)f;
Console.WriteLine(d.ToString("0.0000000000000"));

可能输出的结果让大家疑惑不解,单精度的2.2转换为双精度后,精确到小数点后13位后变为了2.2000000476837,而单精度的2.25转换为双精度后,变为了2.2500000000000,为何2.2在转换后的数值更改了而2.25却没有更改呢?很奇怪吧?其实通过上面关于两种存储结果的介绍,我们已经大概能找到答案。首先我们看看2.25的单精度存储方式,很简单 0 1000 0001 001 0000 0000 0000 0000 0000,而2.25的双精度表示为:0 100 0000 0001 0010 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000,这样2.25在进行强制转换的时候,数值是不会变的,而我们再看看2.2呢,2.2用科学计数法表示应该为:将十进制的小数转换为二进制的小数的方法为将小数 * 2,取整数部分,所以0.282=0.4,所以二进制小数第一位为0.4的整数部分0,0.4×2=0.8,第二位为0,0.8 * 2=1.6,第三位为1,0.6×2 = 1.2,第四位为1,0.2*2=0.4,第五位为0,这样永远也不可能乘到=1.0,得到的二进制是一个无限循环的排列 00110011001100110011… ,对于单精度数据来说,尾数只能表示24bit的精度,所以2.2的float存储为:

在这里插入图片描述

但是这样存储方式,换算成十进制的值,却不会是2.2的,应为十进制在转换为二进制的时候可能会不准确,如2.2,而double类型的数据也存在同样的问题,所以在浮点数表示中会产生些许的误差,在单精度转换为双精度的时候,也会存在误差的问题,对于能够用二进制表示的十进制数据,如2.25,这个误差就会不存在,所以会出现上面比较奇怪的输出结果。

浮点类型转换为十六进制

参考博文

方法1:用地址用指针

#include "stdio.h"
 
int main(void)
{
	 float fa = 123.56;
	 char farray[4] = {0};
	 
	 *(float*)farray = fa;
	 
	 printf("%f\n",*(float*)farray);
	 
	 return (0);
}

输出结果:

123.559998

方法2:用共用体

#include "stdio.h"
 
union {
	 float fa;
	 char farray[4];
}utemp;
 
int main(void)
{
	 int i = 0;
	 float ft = 0.0;
	 
	 utemp.fa = (float)123.56;
	 
	 ft = *(float*)utemp.farray;
	 
	 printf("%f\n",ft);
	 
	 return (0);
}

输出结果:

123.559998

方法3:使用memcpy

#include "stdio.h"
#include "string.h"
 
int main(void)
{
	 float fa;
	 char farray[4];
	 float ft; 
	 
	 fa = 45.23;
	 memcpy(farray,&fa,sizeof(farray));
	 memcpy(&ft,&farray,sizeof(farray)); 
	 printf("%f\n",ft);
	 
	 return (0);
}

输出结果:

45.230000

十六进制转换为浮点类型

#include "stdio.h"
 
int main(void)
{
    unsigned char pMem[] = {0x66,0xE6,0xF0,0x42};
    float *p = (float*)pMem;
    printf("%g\r\n",*p);
 
    return 0;
}

输出结果:

120.45

最后为各位分享一个十分便利的十六进制和浮点类型互相转换的小工具:

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

浮点数在计算机中存储方式、十六进制(HEX)和浮点类型(float、double)转换 的相关文章

  • socket网络编程几大模型?看看CHAT是如何回复的?

    CHAT回复 网络编程中常见的有以下几种模型 1 阻塞I O模型 Blocking I O 传统的同步I O模型 一次只处理一个请求 2 非阻塞I O模型 Non blocking I O 应用程序轮询调用socket相关函数检查请求 不需
  • 电商数据api接口商品评论接口接入代码演示案例

    电商数据API接口商品评论 接口接入入口 提高用户体验 通过获取用户对商品的评论 商家可以了解用户对商品的满意度和需求 从而优化商品和服务 提高用户体验 提升销售业绩 用户在购买商品前通常会查看其他用户的评论 以了解商品的实际效果和质量 商
  • 软件测试|Python数据可视化神器——pyecharts教程(九)

    使用pyecharts绘制K线图进阶版 简介 K线图 Kandlestick Chart 又称蜡烛图 是一种用于可视化金融市场价格走势和交易数据的图表类型 它是股票 外汇 期货等金融市场中最常用的技术分析工具之一 可以提供关于价格变动 趋势
  • 基于java的学生成绩在线管理系统设计与实现

    基于java的学生成绩在线管理系统设计与实现 I 引言 A 研究背景和动机 基于Java的学生成绩在线管理系统设计与实现的研究背景和动机是设计一个可以方便管理学生成绩的系统 该系统可以方便地记录学生的成绩 并为老师和学生提供查询和统计功能
  • 【计算机毕业设计】电商个性化推荐系统

    伴随着我国社会的发展 人民生活质量日益提高 于是对电商个性化推荐进行规范而严格是十分有必要的 所以许许多多的信息管理系统应运而生 此时单靠人力应对这些事务就显得有些力不从心了 所以本论文将设计一套电商个性化推荐系统 帮助商家进行商品信息 在
  • 【计算机毕业设计】二手图书交易系统

    随着世界经济信息化 全球化的到来和互联网的飞速发展 推动了各行业的改革 若想达到安全 快捷的目的 就需要拥有信息化的组织和管理模式 建立一套合理 动态的 交互友好的 高效的二手图书交易系统 当前的信息管理存在工作效率低 工作繁杂等问题 基于
  • 【C++】__declspec含义

    目录 一 declspec dllexport 如果这篇文章对你有所帮助 渴望获得你的一个点赞 一 declspec dllexport declspec dllexport 是 Microsoft Visual C 编译器提供的一个扩展
  • 【卡尔曼滤波】具有梯度流的一类系统的扩散映射卡尔曼滤波器研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码 数据 文章
  • 2024诸多大厂春招提前启动!Android的程序员还在等什么

    春招 提前批 已开 xdm别打瞌睡了 格力 顺丰 酷狗 沃尔玛中国 理想 科大讯飞等开启春招 开始收简历了 还有hc的企业提前抢人 春招时间短 节奏快 招满即止 就算挂了也绝不能不投 对企业来说 秋招和春招都是储备人才的黄金时期 春招中 除
  • 史上最全Java面试八股文(带全部答案)2024年最新版

    今天要谈的主题是关于求职 求职是在每个技术人员的生涯中都要经历多次 对于我们大部分人而言 在进入自己心仪的公司之前少不了准备工作 有一份全面细致 面试题 将帮助我们减少许多麻烦 在跳槽季来临之前 特地做这个系列的文章 一方面帮助自己巩固下基
  • APP开发毕业设计|ssm爱心小屋公益机构智慧管理APP

    作者主页 编程指南针 作者简介 Java领域优质创作者 CSDN博客专家 CSDN内容合伙人 掘金特邀作者 阿里云博客专家 51CTO特邀作者 多年架构师设计经验 腾讯课堂常驻讲师 主要内容 Java项目 Python项目 前端项目 人工智
  • 【固定翼飞行器】用于计算固定翼飞机空气动力学的紧凑涡旋格方法研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码实现
  • 【心电图基线估计和去噪方法的群稀疏正则化】带有群稀疏正则化的心电图基线估计和去噪(Matlab实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码及文章
  • 2024年华为OD机试真题-靠谱的车-Python-OD统一考试(C卷)

    题目描述 程序员小明打了一辆出租车去上班 出于职业敏感 他注意到这辆出租车的计费表有点问题 总是偏大 出租车司机解释说他不喜欢数字4 所以改装了计费表 任何数字位置遇到数字4就直接跳过 其余功能都正常 比如 1 23再多一块钱就变为25 2
  • 学Python,一个月从小白到大神?看你怎么学!

    Python是一门超强大而且超受欢迎的编程语言 它被用在各种领域 比如网站开发 数据分析 人工智能和机器学习 学会Python会给你创造很多职业机会 所以绝对是值得一试的 但你有没有过这样的梦想 一个月时间 从Python小白变成Pytho
  • 2024年华为OD机试真题-查找接口成功率最优时间段-Python-OD统一考试(C卷)

    题目描述 服务之间交换的接口成功率作为服务调用关键质量特性 某个时间段内的接口失败率使用一个数组表示 数组中每个元素都是单位时间内失败率数值 数组中的数值为0 100的整数 给定一个数值 minAverageLost 表示某个时间段内平均失
  • 计算机Java项目|有机蔬菜商城

    作者简介 Java领域优质创作者 CSDN博客专家 CSDN内容合伙人 掘金特邀作者 阿里云博客专家 51CTO特邀作者 多年架构师设计经验 腾讯课堂常驻讲师 主要内容 Java项目 Python项目 前端项目 人工智能与大数据 简历模板
  • 2024最强Java面试八股文合集(持续更新)

    今天要谈的主题是关于求职 求职是在每个技术人员的生涯中都要经历多次 对于我们大部分人而言 在进入自己心仪的公司之前少不了准备工作 有一份全面细致 面试题 将帮助我们减少许多麻烦 在跳槽季来临之前 特地做这个系列的文章 一方面帮助自己巩固下基
  • 在 Python 中实现 List 抽象

    在 Python 中 创建一个包含多个对象的 list 很常见 例如 对于一组具有相同功能的对象 比如播放声音 希望能够使用类似 my list play 的语法来触发 list 中所有对象的 play 方法 另一个例子是 当希望关闭 li
  • 【安全】Java幂等性校验解决重复点击(6种实现方式)

    目录 一 简介 1 1 什么是幂等 1 2 为什么需要幂等性 1 3 接口超时 应该如何处理 1 4 幂等性对系统的影响 二 Restful API 接口的幂等性 三 实现方式 3 1 数据库层面 主键 唯一索引冲突 3 2 数据库层面 乐

随机推荐

  • Leetcode 题解系列--Leetcode1 两数之和

    题目描述 两数之和 给定一个整数数组 nums 和一个目标值 target 请你在该数组中找出和为目标值的那 两个 整数 并返回他们的数组下标 你可以假设每种输入只会对应一个答案 但是 数组中同一个元素不能使用两遍 解题思路 解法一 直观的
  • 用虚拟机搭建出来的服务器和阿里云腾讯云买的服务器的区别在哪里?

    讲真 区别蛮大的 说天壤之别 也不为过 我们来列举以下几个方面的差别 1 网络 云平台提供的网络一般都是多线BGP 也就是说无论你现在是什么网络环境 都可以保障流畅的访问 而本地出于成本的考虑 最多两根光纤 外部访问的流畅性得不到保障 2
  • JS 阻止事件冒泡

    冒泡事件就是 你给父元素绑定了一个事件 你点击子元素也会触发这个事件 因为事件是向上冒泡的 阻止冒泡的方法最常见的方法有两种 1 if event target this 使用这个判断就可以确定你点击的元素是否是事件触发的来源 这样就会阻止
  • Web Socket简介

    1 Web Socket 是 HTML5 的新协议 允许服务器端向客户端发送数据 是一种全双工 双向的通信方式 并且它可以保持长时间通信 概念理解 1 全双工 意思就是服务器向浏览器发送数据的同时 浏览器也可以向服务器传递数据 即同时进行信
  • 腾讯智影+IDM进行数字人制作(无限使用)

    腾讯智影 IDM进行数字人制作 无限使用 首先确保您电脑上有windows自带的Edge浏览器 安装IDM下载工具 IDM 安装到浏览器扩展 下载IDM使用工具 链接 https pan baidu com s 1iARibnICpbnOR
  • python监听、操作键盘鼠标库pynput详细教程

    0 0 0 前言 监听 操作鼠标 键盘是实现自动化的捷径 比如我实现自动化签到用到了模拟键盘操作 pynput是监听 操控鼠标和键盘的跨平台第三方python库 你可以通过pip insnall pynput来安装 安装时会自动下载依赖库
  • 北京五棵松:你记忆中的后备箱夜市,来了!

    每个人 可能都有这么一段记忆 到了晚上的时候 我们约好了 来到了老地方 逛夜市 这是我们一贯的小爱好 同样是逛 但不同于逛商场 这里的人 这里的物 这里的景 都是生活的一部分 这里有熟悉的脸 也有陌生的脸 他们有的坐在小凳上 有的倚在墙上或
  • windows net user 添加用户

    文章目录 问题 net user 解决 问题 使用控制面板 设置 添加用户时 显示成这样 可能是因为 win10 家庭版的原因 net user 解决 以管理员身份运行 cmd 执行 net user user name password
  • ​微调神器 Finetuner,提升 CLIP 模型性能

    经证实 在海量的数据集上训练的大型神经网络模型可以完成一些之前被认为是AI领域亟待攻克的问题 例如 正确识别猫和袋鼠的图像一直都被看作非常困难的问题 但现在通过使用大型的神经网络模型已经可以很好地解决 然而 这些模型都是在类别广泛的数据集上
  • 基于Matlab的差分算法优化ANN数据预测

    基于Matlab的差分算法优化ANN数据预测 概述 人工神经网络 Artificial Neural Network ANN 是一种模拟生物神经系统工作机制的计算模型 具有强大的非线性建模和预测能力 然而 在ANN应用于数据预测问题时 常常
  • 负载平衡策略

    负载平衡软件解决方案有LVS HAProxy Nginx等 以Nginx为例负载均衡有以下几种策略 1 轮询 Round Robin 根据Nginx配置文件中的顺序 依次把客户端的web请求分发到不同的后端服务器 如果后端服务器down掉
  • 文件上传能通过ajax上传吗,通过ajax上传文件

    我使用2个文件index js upload php尝试通过ajax上传文件 img 如果成功追加到div uploadfile show 但是它不起作用 有几个问题 下面我的代码有什么建议吗 谢谢 upload php 1 form en
  • Vue脚手架的创建以及Eslint的解决

    1 创建脚手架 win R cmd 打开命令行窗口 运行下面代码 npm i g vue cli 2 cd Desktop 转到桌面 创建项目 vue create 项目名字 例如 vue create test 3 在自己写的项目中 出现
  • MD5加密及随机数生成

    今天贴两个简单的方法 需要的时候不用自己再写 public static String md5 String plaintext MessageDigest m try m MessageDigest getInstance MD5 m r
  • grafana 表格自动刷新

  • POSIX线程:API

    一 线程创建与取消 1 线程创建 1 1 线程与进程 相对进程而言 线程是一个更加接近于执行体的概念 它可以与同进程中的其他线程共享数据 但拥有自己的栈空间 拥有独立的执行序列 在串行程序基础上引入线程和进程是为了提高程序的并发度 从而提高
  • [数学]齐次线性方程组的解、SVD、最小二乘法

    AX 0 这是一个齐次线性方程组 一般的非齐次线性方程组AX b其实也都可以化为齐次方程组的形式 所以比较普遍 先要说明在非齐次方程组中 A到底有没有解析解 可以由增广矩阵来判断 r A
  • 颠覆人才市场?区块链凭什么?

    原创 点宽学园 作者 王启瑞 全文字数2509字 建议阅读时长 8 分钟 数字化平台包括 ABCD 四大核心技术 分别是人工智能 A Artificial Intelligence 区块链 B BlockChain 云计算 C Cloud
  • 我的学习体验是这样的,关于

    话说 完全没有想到 自己在知乎发布的第一篇文章 我在知乎学写作 竟然收获到还不错的互动 坦率地说 已经比我的微信公众号推文的效果好太多 我想 这主要是得益于大家对于知乎写作课本身的兴趣吧 到目前为止 虽然还没有修完知乎写作课的全部课程 但是
  • 浮点数在计算机中存储方式、十六进制(HEX)和浮点类型(float、double)转换

    目录 浮点数在计算机中存储方式 举例 8 25和120 5在内存中真正的存储方式 浮点类型转换为十六进制 方法1 用地址用指针 方法2 用共用体 方法3 使用memcpy 十六进制转换为浮点类型 浮点数在计算机中存储方式 https www