float和double(浮点型数据)在内存中的储存方法

作者:元清加油
主页:主页
编译环境:visual studio 2022 (x86)

相信大家都知道数据在内存中是以二进制储存的

整数的储存方法是首位是符号位,后面便是数值位

那么浮点数在内存中是怎么储存的呢?我们先来看一个例子?

#include<iostream>
using namespace std;int main()
{int n = 9;float* pFloat = (float*)&n;printf("n的值为:%d\n", n);printf("*pFloat的值为:%.f\n", *pFloat);*pFloat = 9.0;printf("n的值为:%d\n", n);printf("*pFloat的值为:%f\n", *pFloat);return 0;
}

打印出来是?

n的值为: 9
*pFloat的值为:0
n的值为:1091567616
*pFloat的值为:9.000000

num 和 *pFloat 在内存中明明是同一个数,为什么浮点数和整数打印出来不一样
要理解这个结果,一定要搞懂浮点数在计算机内部的表示方法

根据国际标准 IEEE (电气和电子工程协会) 754 ,任意一个二进制浮点数 V 可以表示成下面的形式:

  • V =(-1)^S * M * 2^E
  • (-1)^S 表示符号位
    当 S=0 , V 为正数
    当 S=1 , V 为负数
  • M 表示有效数字,大于等于 1 ,小于 2
  • 2^E 表示指数位

所以当我们得出一个浮点数的S和M以及E,便可以得出这个数的大小
我们如何得到一个浮点数的S和M以及E呢

十进制的 5.0 ,写成二进制是 101.0 ,可以得出
(表示符号位) S=0
(表示有效数字)M=1.01
(表示指数位)E=2
十进制的-5.0,写成二进制是 -101.0 ,可以得出
(表示符号位) S=1
(表示有效数字)M=1.01
(表示指数位)E=2

十进制的 123.125 ,写成二进制是 1111011.001 ,可以得出
(表示符号位) S=0
(表示有效数字)M=1.111011001
(表示指数位)E= 6

IEEE 754规定:
对于32位的浮点数,最高的1位是符号位s,接着的8位是指数E,剩下的23位为有效数字M。
32
对于64位的浮点数,最高的1位是符号位S,接着的11位是指数E,剩下的52位为有效数字M
在这里插入图片描述

IEEE 754对有效数字M指数E,还有一些特别规定

  1. 有效数字M的规定
  • 1≤M<2 ,也就是说, 有效数字M 可以写成 1.xxxxxx 的形式,其中xxxxxx 表示小数部分
  • IEEE 754规定,在计算机内部保存有效数字M时,默认这个数的第一位总是1,因此可以被舍去,只保存后面的 xxxxxx部分
  • 比如保存 1.01 的时候,只保存01,等到读取的时候,再把第一位的 1 加上去。
  • 这样做的目的,是节省 1 位有效数字。以 32 位 浮点数为例,留给M 只有 23 位,将第一位的 1 舍去以后,等于可以保存 24 位有效数字。
  1. 指数E的规定
  • 首先, E 为一个无符号整数( unsigned int )
    (1) 如果 E 为 8 位,它的取值范围为 0到255
    (2) 如果 E 为 11 位,它的取值范围为 0到2047
    科学计数法中的E是可以出现负数的,
    所以IEEE 754规定,存入内存时E的真实值必须再加上一个中间数,
    (1) 对于8位的E,这个中间数 是127
    (2) 对于11位的E,这个中间数是1023
    比如,2^10 的 E 是 10 ,所以保存成 32 位浮点数时,必须保存成 10+127=137 ,即 10001001。

  • E不全为0或不全为1
    这时,浮点数就采用下面的规则表示,即指数E的计算值减去127(或1023),得到真实值,再将有效数字M前加上第一位的1。
    比如:十进制0.5(1/2)的二进制形式为0.1,由于规定正数部分必须为1,即将小数点右移1位, 其阶码E为-1+127=126,表示为01111110,
    而尾数1.0去掉整数部分为0,补齐0到23位00000000000000000000000,则其二进制表示形式为:0 01111110 00000000000000000000000

  • E全为0
    这时,浮点数的指数E等于1-127(或者1-1023)即为真实值,
    有效数字M不再加上第一位的1,而是还原为0.xxxxxx的小数。这样做是为了表示±0,以及接近于0的很小的数字。

  • E全为1
    这时,如果有效数字M全为0,表示±无穷大(正负取决于符号位s)


我们回到上面的问题

	int n = 9;float* pFloat = (float*)&n;printf("n的值为:%d\n", n);printf("*pFloat的值为:%f\n", *pFloat);*pFloat = 9.0;printf("n的值为:%d\n", n);printf("*pFloat的值为:%f\n", *pFloat);

在这里插入图片描述

  1. 为什么 9 强转成浮点数,就成了 0.000000

9 -> 0000 0000 0000 0000 0000 0000 0000 1001

当他是整型时候是9
当他是浮点型时候,我们可以得出

  • 符号位 s=0
  • 指数 E=00000000
  • 有效数字 M=000 0000 0000 0000 0000 1001

由于指数 E 全为 0 ,所以符合上一节的第二种情况
显然, V 是一个很小的接近于 0 的正数,所以用十进制小数表示就是 0.000000

首先,浮点数 9.0 等于二进制的 1001.0 ,即 1.001×2^3 。

  • 符号位 s = 0
  • 有效数字 M 等于 001 后面再加 20 个0 ,凑满 23 位
  • ***指数 E 等于 3+127=130 , 即10000010 ***
    所以,写成二进制形式:

0 10000010 001 0000 0000 0000 0000 0000

这个 32 位的二进制数,还原成十进制,正是 1091567616 。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/170867.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android WiFi的断开分析

1.wifi断开大体流程&#xff1a; 1.wifi断开 wlan-driver最先知道。 2.wlan-driver在与路由器连接的时候(未断开时), 会有周期性的beacon帧来维持连接&#xff0c;AP端一旦遇到突发事情&#xff0c;会立刻通过802.11协议的 deauth 帧/ reject 帧等 通知到 driver。 3. wlan-…

【Java程序员面试专栏 专业技能篇 】Java SE核心面试指引(四):Java新特性

关于Java SE部分的核心知识进行一网打尽,包括四部分:基础知识考察、面向对象思想、核心机制策略、Java新特性,通过一篇文章串联面试重点,并且帮助加强日常基础知识的理解,全局思维导图如下所示 本篇Blog为第四部分:Java新特性,子节点表示追问或同级提问 Java8新特性…

【部署运维】docker:入门到进阶

0 前言 部署运维博客系列一共有三篇&#xff1a; 拥抱开源&#xff0c;将工作中的经验分享出来&#xff0c;尽量避免新手踩坑。 【部署运维】docker&#xff1a;入门到进阶 【部署运维】kubernetes&#xff1a;容器集群管理掌握这些就够了 【部署运维】pythonredisceleryd…

快速、精确仿真高频电磁场的工具CST Studio Suite 2024版本下载与安装配置

目录 前言一、CST 2024 安装二、使用配置总结 前言 CST Studio Suite是一个集成的仿真工具套件&#xff0c;用于模拟和优化电子系统的性能。它包括多个工具和模块&#xff0c;如电磁仿真、结构仿真、热仿真、电路分析等&#xff0c;以支持从概念设计到生产部署的整个开发周期。…

Vue19 列表过滤

直接上代码 以下代码使用了两种实现方式&#xff0c;监视属性和计算属性 当能用计算属性实现时&#xff0c;推荐使用计算属性 <!DOCTYPE html> <html><head><meta charset"UTF-8" /><title>列表过滤</title><script type&q…

阿里元境亮相第八届世界物联网大会,分享元计算对数字文旅的创新赋能

2023&#xff08;第八届&#xff09;世界物联网大会于11月20日在中国北京隆重开幕。联合国秘书长安东尼奥古特雷斯在开幕式发表书面致辞时特别提到&#xff1a;“在一个相互连接的世界&#xff0c;你们的主题‘新物联、新经济、新时代’是数字技术影响力的见证”。 11月21日上午…

Linux系统常用指令大全(图文详解)

目录 前言 一、UNIX的登录与退出 1、登录 &#xff08;1&#xff09;执行格式&#xff1a; &#xff08;2&#xff09;步骤 2、退出 二、UNIX命令格式 三、常用命令 1、目录操作 &#xff08;1&#xff09;显示目录文件 ls &#xff08;2&#xff09;建新目录 …

Android仿 美团 / 饿了么,店铺详情页功能

前言 UI有所不同&#xff0c;但功能差不多&#xff0c;商品添加购物车功能 正在写&#xff0c;写完会提交仓库。 页面主要由&#xff1a;MagicIndicator ViewPager2 Fragment CoordinatorLayout NestedScrollView RecyclerView实现。 效果图一&#xff1a;左右RecyclerV…

微机课设--汇编语言在51单片机上写一个四位十进制加法器

代码如下 KEYVAL EQU 30HKEYTM EQU 31HKEYSCAN EQU 32HDAT EQU 33HSCANLED EQU 37HS_DAT EQU 38HD_DAT EQU 39HR_DATL EQU 3AHR_DATH EQU 3BH CALFLAG EQU 3CHFLAG BIT 00HORG 0000HLJMP MAINORG 000BHLJMP T0ISRORG 0030HMAIN:MOV SP,#5FHMOV TMOD,#01HMOV TH0,#0D8HMOV TL0,…

java中BigDecimal的介绍及使用(二)

系列文章目录 java中BigDecimal的介绍及使用&#xff0c;BigDecimal格式化&#xff0c;BigDecimal常见问题java中BigDecimal的介绍及使用(二) 文章目录 系列文章目录一、前言二、BigDecimal提供的方法2.1、stripTrailingZeros() 去除小数尾部所有的02.2、int signum()2.3、int…

Linux网络——网络层

目录 一.IP协议&#xff08;IPv4&#xff09; 二.子网划分 三.特殊的IP地址 四.IP地址的数量限制 五.私有IP地址和公网IP地址 六.路由 七.分片 一.IP协议&#xff08;IPv4&#xff09; IP协议&#xff1a;提供一种能力使得数据从一个主机发送到另一个主机的能力。 TCP协…

深度学习第1天:深度学习入门-Keras与典型神经网络结构

☁️主页 Nowl &#x1f525;专栏《机器学习实战》 《机器学习》 &#x1f4d1;君子坐而论道&#xff0c;少年起而行之 文章目录 神经网络 介绍 结构 基本要素 Keras 介绍 导入 定义网络 模型训练 前馈神经网络 特点 常见类型 代码示例 反馈神经网络 特点 …

JDK、JRE、JVM的特点和关联

Java 的三个重要的概念是 JDK&#xff08;Java Development Kit&#xff09;、JRE&#xff08;Java Runtime Environment&#xff09;和 JVM&#xff08;Java Virtual Machine&#xff09;。它们之间有着密切的关联&#xff0c;同时又有不同的职责和特点。 JDK&#xff08;Java…

laravel实现发送邮件功能

Laravel提供了简单易用的邮件发送功能&#xff0c;使用SMTP、Mailgun、Sendmail等多种驱动程序&#xff0c;以及模板引擎将邮件内容进行渲染。 1.在项目目录.env配置email信息 MAIL_MAILERsmtp MAIL_HOSTsmtp.qq.com MAIL_PORT465 MAIL_FROM_ADDRESSuserqq.com MAIL_USERNAME…

【代码】基于量子粒子群算法(QPSO)优化LSTM的风电、负荷等时间序列预测算法matlab

程序名称&#xff1a;基于量子粒子群算法&#xff08;QPSO&#xff09;优化LSTM的风电、负荷等时间序列预测算法 实现平台&#xff1a;matlab 代码简介&#xff1a;代码是基于QPSO-LSTM的负荷、光伏、风电等时间序列预测&#xff0c;MATLAB编写。包含LSTM&#xff08;长短时记…

2、用命令行编译Qt程序生成可执行文件exe

一、创建源文件 1、新建一个文件夹&#xff0c;并创建一个txt文件 2、重命名为main.cpp 3、在main.cpp中添加如下代码 #include <QApplication> #include <QDialog> #include <QLabel> int main(int argc, char *argv[]) { QApplication a(argc, argv); QDi…

(附源码)SSM环卫人员管理平台 计算机毕设36412

目 录 摘要 1 绪论 1.1背景及意义 1.2国内外研究概况 1.3研究内容 1.4 ssm框架介绍 1.5论文结构与章节安排 2 环卫人员管理平台系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1数据增加流程 2.2.2数据修改流程 2.2.3数据删除流程 2.3 系统功能分析 2.3.1 功能性…

C++二分查找:统计点对的数目

本题其它解法 C双指针算法&#xff1a;统计点对的数目 本周推荐阅读 C二分算法&#xff1a;得到子序列的最少操作次数 本文涉及的基础知识点 二分查找算法合集 题目 给你一个无向图&#xff0c;无向图由整数 n &#xff0c;表示图中节点的数目&#xff0c;和 edges 组成…

Proteus仿真--基于PG12864LCD设计的指针式电子钟

本文介绍基于PG12864LCD设计的指针式电子钟&#xff08;完整仿真源文件及代码见文末链接&#xff09; 仿真图如下 本设计中时间芯片选用DS1302芯片&#xff0c;液晶选用PG12864LCD模块&#xff0c;按键K1-K3&#xff0c;K1用于时分选择&#xff0c;K2用于调整功能&#xff0c…

Docker Swarm总结+CI/CD Devops、gitlab、sonarqube以及harbor的安装集成配置(3/4)

博主介绍&#xff1a;Java领域优质创作者,博客之星城市赛道TOP20、专注于前端流行技术框架、Java后端技术领域、项目实战运维以及GIS地理信息领域。 &#x1f345;文末获取源码下载地址&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3fb;…