(C语言)浮点数在内存中的存储详解

1. 浮点数

常见的浮点数:3.14159、 1E10等 ,浮点数家族包括:  floatdoublelong double 类型。

浮点数表示的范围: float.h  中定义.

2. 浮点数的存储

我们先来看一串代码:

int main()
{int n = 9;float* pFloat = (float*)&n;printf("n的值为:%d\n", n);printf("*pFloat的值为:%f\n", *pFloat);* pFloat = 9.0;printf("num的值为:%d\n", n);printf("*pFloat的值为:%f\n", *pFloat);return 0;
}

想一想输出结果是什么?

出乎我们的意料。

原因在于浮点数的存储方式与整形有很大不同,下面我们来看一下。

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

V  = (−1)S   M  2E

.   (−1)S  表示符号位  当S=0 ,V为正数; 当S=1 ,V为负数

.  M 表示有效数字 ,M是大于等于1 ,小于2的

.  2E 表示指数位

举例来说:

十进制的5.0 ,写成二进制是 101.0 ,相当于 1.01*2^2  。那么 ,按照上面V的格式 ,可以得出S=0 ,M=1.01 ,E=2

十进制的-5.0 ,写成二进制是 -101.0 ,相当于  -1.01*2^2 。那么 ,S=1 ,M=1.01 ,E=2。

IEEE 754规定:对于32位的浮点数 ,最高的1位存储符号位S ,接着的8位存储指数E ,剩下的23位存储有效数字M ; 对于64位的浮点数 ,最高的1位存储符号位S,接着11位存储指数E,剩下的52位存储有效数字M

32位情况:

64位情况:

3。 浮点数的存储过程

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

前面说过 ,1<=M<2 也就是说 ,M可以写成1.xxxxxxx的形式 ,其中xxxxxxxxxx表示小数分。IEEE 754 规定 ,在计算机内部保存M时 ,默认这个数的第一位总是1 ,因此可以被舍去 ,只保存后面的 xxxxxx部分。 比如保存1.01的时候 ,只保存01 ,等到读取的时候 ,再把第一位的1加上去。这样做的目 ,是节省1位有效数字。 以32位浮点数为例 ,留给M只有23位 ,将第一位的1舍去以后 ,等于可以保存24位有效数字。

至于指数E ,情况就比较复杂首先 ,E为一个无符号整数(unsigned int)。这意味着 ,如果E为8位 ,它的取值范围为0~255;如果E为11位 ,它的取值范围为0~2047。但是 ,我们知道 ,科学计数法中的E是可以出现负数的 ,所以IEEE 754规定 ,存入内存时E的真实值必须再加上 一个中间数 ,对于8位的E ,这个中间数是127;对于11位的E ,这个中间数是1023。 比如 ,2^10的E是 10 ,所以保存成32位浮点数时 ,必须保存成10+127=137 ,即10001001。

4. 浮点数取的过程

指数E从内存中取出还可以再分成三种情况:

4.1 E不全为0或不全为1

这时 ,浮点数就采用下面的规则表示 ,即指数E的计算值减去127(或1023), 得到真实值 ,再将有效 数字M前加上第一位的1。

比如:0.5 的二进制形式为0.1  由于规定正数部分必须为1 ,即将小数点右移1位 则为1.0*2^(-1) ,其阶码为-1+127(中间值)=126 ,表示为01111110 ,而尾数1.0去掉整数部分为0 ,补齐0到23位 00000000000000000000000 ,则其二进制表示形式为:

0 01111110 00000000000000000000000

4.2 E全为0

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

0 00000000 00100000000000000000000

4.3 E全为1

这时 ,即使有效数字M全为0 ,也表示±无穷大(正负取决于符号位s);

0 11111111 00010000000000000000000

我们学习了浮点数的存储下面我们回过头来看看前面的那道题目

5. 题目解析:

int main()
{int n = 9;float* pFloat = (float*)&n;printf("n的值为:%d\n", n);printf("*pFloat的值为:%f\n", *pFloat);* pFloat = 9.0;printf("num的值为:%d\n", n);printf("*pFloat的值为:%f\n", *pFloat);return 0;
}

先看第1环节 ,为什么 9 还原成浮点数 ,就成了0.000000。 9以整型的形式存储在内存中 ,得到如下二进制序列:0000 0000 0000 0000 0000 0000 0000 1001

首先 ,将9的二进制序列按照浮点数的形式拆分 ,得到第一位符号位s=0 ,后面8位的指数E=00000000。后23位的有效数字M=000 0000 0000 0000 0000 1001。由于指数E全为0 ,所以符合E为全0的情况。 因此 浮点数V就写成:

V=(-1)^0 × 0.00000000000000000001001×2^(-126)=1.001×2^(-146)

显然 ,V是一个很小的接近于0的正数 ,所以用十进制小数表示就是0.000000。

再看第2环节 ,浮点数9.0 ,为什么整数打印是 1091567616

首先 ,浮点数9.0 等于二进制的1001.0 ,即换算成科学计数法是: 1.001×2^3

所以: 9.0 = (−1)0   (1.001) ∗ 23 

那么 ,第一位的符号位S=0 ,有效数字M等于001后面再加20个0 ,凑满23位 ,指数E等于3+127=130, 即10000010。所以 ,写成二进制形式 ,应该是S+E+M ,即

0 10000010 001 0000 0000 0000 0000 0000

这个32位的二进制数 ,被当做整数来解析的时候 ,就是整数在内存中的补 ,原码正是1091567616。

感谢观看,欢迎在评论区讨论。

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

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

相关文章

安全工具介绍 SCNR/Arachni

关于SCNR 原来叫Arachni 是开源的&#xff0c;现在是SCNR&#xff0c;商用工具了 可试用一个月 Arachni Web Application Security Scanner Framework 看名字就知道了&#xff0c;针对web app 的安全工具&#xff0c;DASTIAST吧 安装 安装之前先 sudo apt-get update sudo…

嵌入式数据库--SQLite

目录 1. SQLite数据库简介 2. SQLite数据库的安装 方式一&#xff1a; 方式二&#xff1a; 3. SQLite的命令用法 1.创建一个数据库 2.创建一张表 3.删除表 4.插入数据 5. 查询数据 6.删除表内一条数据 7.修改表中的数据 8.增加一列也就是增加一个字段 1. SQLite数据库…

C++ 【深基5.例3】冰雹猜想

文章目录 一、题目描述【深基5.例3】冰雹猜想题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示 二、参考代码 一、题目描述 【深基5.例3】冰雹猜想 题目描述 给出一个正整数 n n n&#xff0c;然后对这个数字一直进行下面的操作&#xff1a;如果这个数字是奇数…

LeetCode每日一题——统计桌面上的不同数字

统计桌面上的不同数字OJ链接&#xff1a;2549. 统计桌面上的不同数字 - 力扣&#xff08;LeetCode&#xff09; 题目&#xff1a; 思路&#xff1a; 这是一个很简单的数学问题&#xff1a; 当n 5时&#xff0c;因为n % 4 1&#xff0c;所以下一天4一定会被放上桌面 当n 4…

Linux系统 安装docker

安装&#xff1a; 1、Docker要求CentOS系统的内核版本高于 3.10 &#xff0c;通过 uname -r 命令查看你当前的内核版本是否支持安账docker 2、更新yum包&#xff1a; sudo yum -y update 3、安装需要的软件包&#xff0c;yum-util 提供yum-config-manager功能&#xff0c;另外…

kvm虚拟化

kvm虚拟化 1. 虚拟化介绍 虚拟化是云计算的基础。简单的说&#xff0c;虚拟化使得在一台物理的服务器上可以跑多台虚拟机&#xff0c;虚拟机共享物理机的 CPU、内存、IO 硬件资源&#xff0c;但逻辑上虚拟机之间是相互隔离的。 物理机我们一般称为宿主机&#xff08;Host&…

深度学习pytorch——多层感知机反向传播(持续更新)

在讲解多层感知机反向传播之前&#xff0c;先来回顾一下多输出感知机的问题&#xff0c;下图是一个多输出感知机模型&#xff1a; 课时44 反向传播算法-1_哔哩哔哩_bilibili 根据上一次的分析深度学习pytorch——感知机&#xff08;Perceptron&#xff09;&#xff08;持续更新…

trt | TFLOPS TOPS含义

FLOPS是Floating-point Operations Per Second的缩写&#xff0c;代表每秒所执行的浮点运算次数。现在衡量计算能力的标准是TFLOPS&#xff08;每秒万亿次浮点运算&#xff09; NVIDIA显卡算力表&#xff1a;CUDA GPUs - Compute Capability | NVIDIA Developer 例如&#xf…

数学(算法竞赛、蓝桥杯)--快速幂

1、B站视频链接&#xff1a;G01 快速幂_哔哩哔哩_bilibili 题目链接&#xff1a;P1226 【模板】快速幂 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) #include <bits/stdc.h> using namespace std; typedef long long LL; int a,b,p; int quickpow(LL a,int n,int p){…

Wear-Any-Way——可控虚拟试衣一键试穿,可自定义穿着方式

概述 Wear-Any-Way 是阿里巴巴最新推出的虚拟试衣技术&#xff0c;它不仅可以让用户在虚拟环境中试穿衣服&#xff0c;还可以根据需要自定义衣服的样式&#xff0c;比如卷起袖子、打开或拖动外套等。这种技术的引入旨在帮助消费者更好地了解衣服在不同穿着方式下的效果&#x…

突然断电导致git损坏修复

背景 使用ide开发时突然断电启动后所有文件都成了没有提交的文件。打开git视图日志也消失不见 # git命令执行结果如下 git status No commits yetChanges to be committed:(use "git rm --cached <file>..." to unstage)new file: .github/FUNDING.ymlnew …

2024年国内彩妆行业市场数据分析:增长机会在哪?

从伊蒂之屋、菲诗小铺等平价韩妆的退出&#xff0c;到全球第一眉妆贝玲妃的落幕&#xff0c;曾经的“网红”-“全网断货选手”纷纷退出中国市场。 有人认为是国内彩妆市场不景气&#xff1f;事实上&#xff0c;国内彩妆市场线上市场规模仍在持续扩大。根据鲸参谋数据统计&…

短视频矩阵系统源头技术开发--每一次技术迭代

短视频矩阵系统源头开发3年的我们&#xff0c;肯定是需求不断的迭代更新的&#xff0c;目前我们已经迭代了3年之久&#xff0c;写技术文章已经写了短视频矩阵系统&#xff0c;写了3年了&#xff0c;开发了3年了 短视频矩阵获客系统是一种基于短视频平台的获客游戏。短视频矩阵系…

探讨编程中的“优雅降级”策略

在软件开发领域&#xff0c;经常会遇到需要在不同情况下提供不同的解决方案的情况。其中一个常见的策略就是“优雅降级”&#xff0c;即在面临异常或不可预测情况时&#xff0c;系统可以 gracefully 降级&#xff0c;而不是完全失败。这种策略在保障系统稳定性和用户体验方面起…

提升质量透明度,动力电池企业的数据驱动生产实践 | 数据要素 × 工业制造

系列导读 如《“数据要素”三年行动计划&#xff08;2024—2026年&#xff09;》指出&#xff0c;工业制造是“数据要素”的关键领域之一。如何发挥海量数据资源、丰富应用场景等多重优势&#xff0c;以数据流引领技术流、资金流、人才流、物资流&#xff0c;对于制造企业而言…

ctfshow-web入门-反序列化

web254 先看题 <?php/* # -*- coding: utf-8 -*- # Author: h1xa # Date: 2020-12-02 17:44:47 # Last Modified by: h1xa # Last Modified time: 2020-12-02 19:29:02 # email: h1xactfer.com # link: https://ctfer.com*/error_reporting(0); highlight_file(__FIL…

抖音视频关键词批量采集工具|视频无水印爬虫下载软件

抖音视频关键词批量采集工具&#xff1a; 最新推出的抖音视频关键词批量采集工具&#xff0c;为您提供一种便捷的方式通过关键词搜索和提取符合条件的视频内容。以下是详细的操作说明和功能解析&#xff1a; 操作说明&#xff1a; 进入软件后&#xff0c;在第一个选项卡页面…

One Clue c++

描述 有2000001块石头放在一条数线上。这些石子的坐标是 −1000000,−999999,−999998,…,999999,1000000。 其中一些连续的 K 个石子被涂成黑色&#xff0c;其他的被涂成白色。 此外&#xff0c;我们还知道位于坐标 X 的石子被涂成了黑色。 按升序打印所有可能包含被涂成黑…

linux系统Kubernetes工具Service暴露服务

Service ServiceService创建service页面请求测试pod内部请求测试端口解析kube-proxy 使用ipvs 意义pod和Service的关系常用类型ClusterIpNodePortLoadBalancernode内网部署应用&#xff0c;外网访问不到 Service 服务基于ip端口的虚拟主机&#xff0c;定义一组pod的访问规则 Se…

Vue 3 + TypeScript + Vite的现代前端项目框架

随着前端开发技术的飞速发展&#xff0c;Vue 3、TypeScript 和 Vite 构成了现代前端开发的强大组合。这篇博客将指导你如何从零开始搭建一个使用Vue 3、TypeScript以及Vite的前端项目&#xff0c;帮助你快速启动一个性能卓越且类型安全的现代化Web应用。 Vue 3 是一款渐进式Jav…