C语言 | 浮点数在内存中存储方式

news2025/9/19 8:16:52

浮点数其实在内存中也是以2进制的形式存储的,但是它不是以原码、反码、补码的形式存储的。

常见的浮点数:

3.14159

1E10【科学计数法1.0*10^10】

eg:1.23=12.3*10^-1=0.123*10^1

浮点数家族包括:float、double、long double类型

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

大家如果感兴趣的话,其实也可以找到这些文件:

浮点数存储规则 

浮点数存储的例子:


实例一:

#include <stdio.h>
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可以表示成为下面的形式:

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

实例二:

10进制:5.5

2进制:101.1

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

科学计数法:(-1)^0*1.011*2^2

实例三:

10进制:9.0

2进制:1001.0

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

科学计数法:(-1)^0*1.001*2^3

IEE754规定:

对于32位的浮点数,最高位1位是符号位S,接着的8位是指数E,剩下的32位为有效数字M。

对于64位的浮点数,最高位1位是符号位S,接着的11位是指数E,剩下的52位为有效数字M。

IEEE754浮点数存储规则 

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

M(有效数字)的存储方式:

  • 1<=M<2,也就是说,M可以写成1.XXXXXX的形式,其中XXXXXX表示小数部分。
  • 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,所以保存成浮点数时,必须保存成10+127=137,即10001001。

实例四:

10进制:0.5

2进制:0.1

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

科学计数法:(-1)^0*1.0*2^-1

S=0 M=1.0 E=-1

IEEE754浮点数读取规则  

然后, 指数E从内存中取出还可以分为三种情况:

E不全为0或不全为1:

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

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

E全为0:

这时,浮点数的指数E等于1-127(或者1-1023)即为真实值,指数为-127。

有效数字M不再加上第一位的1,而是还原为0.xxxxxx的小数。这样做是为了表示0。以及接近于0的很小的数字。

E全为1:
这时,如果有效数字M全为0,表示无穷大(正负取决于S位)。

因为这种极端的数字不容易存在,所以就不再举例子了。

在看上面的实例一:

解析:

  • 此时9是以整型形式存储,所以是4个字节
  • 9的补码:00000000 00000000 00000000 00001001
  • 第一个是以%d十进制的形式打印有符号的整型,所以打印出“9”
  • 第二个是以%f以小数形式输出输出实数
  • 接着将整型强制类型转换为浮点型
  • 所以在这个浮点型数据取出时读取的位:0 00000000 00000000000000000001001
  • S:0
  • E:00000000
  • M:00000000000000000001001
  • 然后因为E全为0,而在进行存储的时候,是为了防止E是负数,所以就加上127,所以这个数加上这个127等于127,所以就证明这个数是-127,而又因为2^-127,就是极其小的数字,所以打印出来的结果为:“0.000000”
  • 第三个9.0是以浮点数形式存储在内存中的
  • 9.0的二进制表示形式:1001.0
  • 9.0的科学计数法存储:(-1)^0*1.001*2^3,所以
  • S:0
  • E:3+127=130      10000010
  • M:00100000000000000000000

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

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

相关文章

C语言水平测试题 过关斩将(3)辗转相除法,前n项求和,整数的正序分解,求最大公约数

我的个人主页&#xff1a;☆光之梦☆的博客_CSDN博客-C语言基础语法&#xff08;超详细&#xff09;领域博主 欢迎各位 &#x1f44d;点赞 ⭐收藏 &#x1f4dd;评论 我的专栏&#xff1a;C语言基础语法&#xff08;超详细&#xff09;_☆光之梦☆的博客-CSDN博客&#xff08;这…

Linux 部署 GitLab idea 连接

概述 GitLab 是一个开源的代码管理平台&#xff0c;使用 Git 作为版本控制工具&#xff0c;提供了 Web 界面和多种功能&#xff0c;如 wiki、issue 跟踪、CI/CD 等。 GitLab 可以自托管或使用 SaaS 服务&#xff0c;支持多种操作系统和执行器。 GitLab 可以帮助软件开发团队…

有 AI,无障碍,AIoT 设备为视障人群提供便利

据世界卫生组织统计&#xff0c;全球共 22 亿人视力受损&#xff0c;包含 2.85 亿视障人群和 3,900 万全盲人群。而且&#xff0c;这一数字将随老龄化加剧不断增加。 虽然视障人群面临着诸多不便&#xff0c;但是针对视障人群的辅助设备却存在成本高、维护困难、操作复杂等问题…

小流域洪水分析模拟预报设计及代码实现

应用说明&#xff1a; 利用无人机、卫星等技术&#xff0c;获取小流域洪水模拟分析所需的数据&#xff0c;并将其与模型进行结合&#xff0c;提高模拟精度&#xff1b; 探索小流域洪水模拟分析与城市规划、土地利用等方面的关系&#xff1b; 小流域河流洪水模拟计算分析是一项…

Java编程第9讲——CountDownLatch、CyclicBarrier和Semaphore(万字详解)

在JDK的并发包&#xff08;JUC&#xff09;里提供了几个非常有用的并发工具类。CountDownLatch、CyclicBarrier和Samaphore工具类提供了一种并发流程控制的手段&#xff0c;这同样也是面试和工作中的一个重要知识点&#xff0c;本文将从它们的定义、常用方法、代码示例及核心源…

STM32Cube高效开发教程<基础篇>(一)----概述

一、 STM32系列器件和开发工具发展历史 1.1 开发工具发展史 2014年HAL/LL库和STM32Cube是ST公司STM32Cube计划的产物,旨在提高开发效率。2019年4月,ST公司退出自己的IDE软件STM32CubeIDE,完善了STM32Cube生态系统。 1.2 STM32系列器件 1.3 器件驱动库 标准外设库( Standar…

Python Django 之连接 Mysql 数据库详解

文章目录 1 概述1.1 Mysql 下载和安装1.2 菜单目录 2 ORM 框架2.1 连接 Mysql 模块&#xff1a;mysqlclient2.2 创建数据库2.3 连接 Mysql2.4 创建表2.5 增删改查 3 扩展3.1 ERROR&#xff1a;2026, SSL connection error: unknown error number 1 概述 1.1 Mysql 下载和安装 …

windows安装nvm

源代码 下载 下一步一下步安装即可 检查是否安装成功 nvm出现上面的代码即可安装成功 常用命令 查看目前安装的node版本 nvm list [available]说明没有安装任何版本&#xff0c;下面进行安装 nvm install 18.14使用该版本 node use 18.14.2打开一个新的cmd输入node -…

Self-Instruct

本篇工作利用LLM的生成能力&#xff0c;来产生大量指令数据集&#xff08;指令、输入、输出&#xff09;&#xff0c;无需人工标注数据。 其中&#xff0c;在对任务判别的时候&#xff0c;需要区分是输出优先还是输入优先&#xff1a; 输入优先没问题&#xff0c;符合人类直觉…

面试题:说说Java线程的状态及转换

文章目录 为何要了解Java线程状态Java线程状态转换图Java线程有哪些状态&#xff1f;关于wait()放在while循环的疑问BLOCKED 和 WAITING 状态的区别和联系 为何要了解Java线程状态 线程是 JVM 执行任务的最小单元&#xff0c;理解线程的状态转换是理解后续多线程问题的基础。 …

加持智慧医疗,美格智能5G数传+智能模组让就医触手可及

智慧医疗将云计算、物联网、大数据、AI等新兴技术融合赋能医疗健康领域&#xff0c;是提高医疗健康服务的资源利用效率&#xff0c;创造高质量健康医疗的新途径。《健康中国2030规划纲要》把医疗健康提升到了国家战略层面&#xff0c;之后《“十四五”全面医疗保障规划》等一系…

最新AI写作创作系统源码ChatGPT源码,支持AI绘画/支持OpenAI-GPT全模型+国内AI全模型

一、AI创作系统 SparkAi创作系统是基于OpenAI很火的ChatGPT进行开发的Ai智能问答系统AI绘画系统&#xff0c;支持OpenAI GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署…

池州市的城市环境融合:OLED透明拼接屏展现自然与现代的完美结合

池州是中国安徽省的一个地级市&#xff0c;位于该省的西南部。池州市辖区包括贵池区、东至县、石台县、青阳县等地。 池州市拥有悠久的历史和丰富的文化遗产&#xff0c;同时也以其独特的自然风光而闻名。 首先&#xff0c;让我们来了解一下池州的历史和景点。 池州的历史可…

【TS】笔记-TypeScript环境搭建

TypeScript与JavaScript比较 JavaScript是轻量级的解释性脚本语言&#xff0c;可嵌入到HTML页面中&#xff0c;在浏览器端执行。而TypeScript是JavaScript的超集&#xff0c;即包含JavaScript的所有元素&#xff0c;能运行javaScript的代码&#xff0c;并扩展了JavaScript的语…

竞赛选题 深度学习+opencv+python实现昆虫识别 -图像识别 昆虫识别

文章目录 0 前言1 课题背景2 具体实现3 数据收集和处理3 卷积神经网络2.1卷积层2.2 池化层2.3 激活函数&#xff1a;2.4 全连接层2.5 使用tensorflow中keras模块实现卷积神经网络 4 MobileNetV2网络5 损失函数softmax 交叉熵5.1 softmax函数5.2 交叉熵损失函数 6 优化器SGD7 学…

利达卓越:金融领域的变革者——利达卓越引领行业发展

在过去的几十年里,金融行业面临着经济不确定性、监管压力和竞争加剧等诸多挑战。与此同时,金融领域的迅速发展为行业带来了新的机遇。利达卓越精准地把握了这一机遇,利用先进的科技手段应对挑战。成为金融领域的变革者,引领着金融行业的发展。 利达卓越成立于2015年,至今已有8年…

【Docker】Harbor私有仓库与管理

搭建本地私有仓库 #首先下载 registry 镜像 docker pull registry#在 daemon.json 文件中添加私有镜像仓库地址 vim /etc/docker/daemon.json {"insecure-registries": ["192.168.220.101:5000"], #添加&#xff0c;注意用逗号结尾"registry-mi…

IDEA中创建Web工程流程

第一步&#xff1a;File--》New--》Project 第二步&#xff1a;填写信息&#xff0c;点击Create 第三步&#xff1a;点击File,点击Project Structure 出现该界面 选择相应的版本&#xff0c;这里我用jdk17&#xff0c;点击apply &#xff0c;点击ok 第三步&#xff1a;右键文件…

【C++】异常处理之throw、catch、try、局部资源管理、标准异常库

一、抛出异常 异常处理机制两个主要成分&#xff1a; 异常的鉴定与发出&#xff1b;异常的处理方式。 C通过throw表达式产生异常&#xff1a; inline void Triangular_iterator:: check_integrity() {if(_index>Triangular::max_elems){throw iterator_overflow(_index,…

打造炫酷效果:用Java优雅地制作Excel迷你图

摘要&#xff1a;本文由葡萄城技术团队原创并首发。转载请注明出处&#xff1a;葡萄城官网&#xff0c;葡萄城为开发者提供专业的开发工具、解决方案和服务&#xff0c;赋能开发者。 前言 迷你图是一种简洁而有效的数据可视化方式&#xff0c;常用于展示趋势和变化。它通常由一…