C语言数据存储 —— 浮点型篇

news2024/12/23 13:52:16

C语言数据存储 —— 浮点型篇

  • 前言
  • 1. 一个常见问题
  • 2. 浮点数存储规则
    • 2.1 有效数字M一些特别的规定
    • 2.2 有效数字E一些特别的规定
      • 2.2.1 E如何存入内存
      • 2.2.2 E如何从内存中取出
  • 3. 前面问题的解释。
  • 4. 结尾

前言

浮点数在内存中的存储方式对程序员来说非常重要。理解浮点数的存储方式可以帮助程序员避免一些常见的错误,如:溢出和下溢、舍入误差和类型转换。此外,了解浮点数的存储方式还可以帮助程序员优化代码,提高程序的性能。因此,对一名优秀的程序员来说,理解浮点数在内存中的存储方式是至关重要的!!本文将详细介绍相关语法和标准。

1. 一个常见问题

浮点数存储的例子:

#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("n的值为:%d\n", n);
	printf("*Pfloat的值为:%f\n", *Pfloat);
	return 0;
}

输出结果是什么呢?
在这里插入图片描述
对于结果1和4是毋庸置疑的,那2和3呢?

2. 浮点数存储规则

n 和 *Pfloat在内存中明明是同一个数,为什么浮点数和整数的解读结果会差别这么大?
要理解这个结果,一定要搞懂浮点数在计算机内部的表示方法。

详细解读:

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

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

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

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

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

2.1 有效数字M一些特别的规定

前面说过,1≤M<2,也就是说,M可以写成1.xxxxxxx的形式,其中xxxxxx表示小数部分。

IEEE 754规定,在计算机内部保存M时,默认这个数的第一位总是1,因此可以被舍去,只保存后面xxxxxx部分。
比如保存1.01时,只保存01,等到读取时再把第一位的1加上去。这样做的目的是节省1位有效数字。以32位浮点数为例,留给M只有23位,将第一位的1舍去以后,等于可以保存24位有效数字。

2.2 有效数字E一些特别的规定

2.2.1 E如何存入内存

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

2.2.2 E如何从内存中取出

在C语言中,指数E从内存中取出分为3种情况:

E不全为1或不全为0

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

比如:
0.5(1/2)的二进制形式是0.1,由于规定正数部分必须为1,即将小数点右移1位,则为1.0 * 2^(-1),其阶码为-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)。

3. 前面问题的解释。

#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("n的值为:%d\n", n);
	printf("*Pfloat的值为:%f\n", *Pfloat);
	return 0;
}

结果:
在这里插入图片描述

1和4的结果毋庸置疑,这里仅解释2、3的结果怎么来的。

解释:
首先整型n在内存中存储的补码为:

9 -> 0 00000000 00000000000000000001001

而题目是要我们以浮点数的方式从内存中取出,由于指数E全为0,符合2.2.2中的第二种情况。因此,浮点数V就写成:

V = (-1)^0 * 0.00000000000000000001001 * 2^(-126)

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

在来看第3个结果:
浮点数9.0如何存入内存中呢?
首先先转换为二进制1001.0,即1.001x2^3。

9.0 -> 1001.0 -> (-1)^0 * 1.001 * 2^3 -> S=0,M=1.001,E=3+127=130

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

0 10000010 010 0000 0000 0000 0000

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

4. 结尾

本篇文章到此就结束了,如果对你有帮助记得三连哦!感谢您的支持!!
C语言数据存储 —— 整型篇

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

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

相关文章

数据结构:二叉树经典例题(单选题)-->你真的掌握二叉树了吗?(第一弹)

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;本期来给大家解读一下有关二叉树的经典例题&#xff0c;如果看完之后对你有一定的启发&#xff0c;那么请留下你的三连&#xff0c;祝大家心想事成&#xff01; C 语 言 专 栏&#xff1a;C语言&#xff1a;从入门到精通 数…

消防通道堵塞识别 opencv

消防通道堵塞识别系统通过opencvpython网络模型技术&#xff0c;消防通道堵塞识别对消防通道的状态进行实时监测&#xff0c;检测到消防通道被堵塞时&#xff0c;将自动发出警报提示相关人员及时采取措施。OpenCV的全称是Open Source Computer Vision Library&#xff0c;是一个…

linux-centOS7.9通过docker安装cwmp server:drumsergio/genieacs

一、安装环境 #查看centOS版本 [rootMiWiFi-R4CM-srv network-scripts]# cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core) #自动查找最新安装包并升级 [rootMiWiFi-R4CM-srv ~]# sudo yum upgrade 二、关闭firewalld、NetworkManager、selinux 关闭防火墙、…

【黑马头条-Java微服务项目】

黑马头条-Java微服务项目 (一)、项目介绍1.项目背景介绍(1).基本介绍(2).业务说明(3).项目术语介绍 2.技术栈说明(1).技术栈-基础六层技术(2).技术栈-服务四层技术(3).技术栈-分布 (二)、nacos环境搭建 (一)、项目介绍 1.项目背景介绍 (1).基本介绍 随着智能手机的普及&…

在线选课的微信小程序(微信前端+网站后端)

目录 一、前言 二、微信小程序端&#xff08;老师、学生&#xff09; 1.学生用户前端小程序界面 2.老师前端小程序界面 三、后端&#xff08;管理员、老师、学生&#xff09; 3.老师后端 4.管理员后端 四、代码获取与调试 一、前言 这是一个在线选课的微信小程序&#…

PID控制算法: 3、Tuning Changes(参数调整)

改变控制参数积分项对输出结果的影响 可靠的控制系统应该有能力实时变更系统的参数 The Beginner’s PID acts a little crazy if you try to change the tunings while it’s running. Let’s see why. Here is the state of the beginner’s PID before and after the param…

STM32F4 点亮灯泡【顺序点亮、按键点亮】

一、顺序点亮灯泡 ①初始化 在user.c文件中&#xff0c;我们需要对LED进行初始化设置。 在函数LED_GPIO_Config中&#xff0c;可以修改代码如下&#xff1a; /*********************************************************************** LED初始化 备注 LED 接在GPC14引脚上…

【Springboot集成Neo4j完整版教程】

&#x1f680; Neo4j &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;C…

基于Python+OpenCV图像识别的连连看辅助工具(深度学习+机器视觉)含全部工程源码及视频演示

目录 前言总体设计系统整体结构图系统流程图 运行环境Python 环境Pycharm 环境 模块实现1. 获取句柄2. 图像划分3. 建立矩阵4. 矩阵求解 系统测试工程源代码下载其它资料下载 前言 本项目目标是利用pywin32来获取游戏图像信息&#xff0c;并利用OpenCV进行识别和处理&#xff…

2023学习日志

[牛客网习题练习] 此系列文章仅是对个人学习的记录如有错误望大家指正与谅解。 1.题目描述&#xff1a;输入一个长度为 n 字符串&#xff0c;打印出该字符串中字符的所有排列&#xff0c;你可以以任意顺序返回这个字符串数组。 例如输入字符串ABC,则输出由字符A,B,C所能排列出…

文本分析-使用Python做词频统计分析

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

【JDK】二、环境变量从jdk17切换为jdk8后不生效的解决办法

环境变量从jdk17切换为jdk8后不生效的解决办法 一、问题描述二、环境变量为java17时的截图三、修改为java8时的截图四、解决办法1、原因分析 2、删除jdk17和jdk8默认的配置或者把默认的下移&#xff0c;统一使用自己的%JAVA_HOME%.3、同样我们把JAVA_HOME改成17 重启后&#xf…

面试题:mybatis中# 和 $ 的区别

面试题&#xff1a;mybatis中# 和 $ 的区别 一、主要区别如下&#xff1a; 1、#{}可以理解为预处理&#xff0c;而${}是直接替换。 #传入的参数在SQL中显示为字符串&#xff0c;会对自动传入的数据加上双引号。 $传入的参数在SQL中直接显示为传入的值 2、#{}试用于所有类型…

不要再封装各种Util工具类了,这个神级框架你值得拥有!

一、功能 二、安装 三、简单测试 今天给大家推荐一个非常好用的Java工具类库&#xff0c;企业级常用工具类&#xff0c;基本都有&#xff0c;能避免重复造轮子及节省大量的开发时间&#xff0c;非常不错&#xff0c;值得大家去了解使用。 Hutool 谐音 “糊涂”&#xff0c;…

STM32F4的连接初始化【ST-LINK、USB To TTL】

所需设备&#xff1a;STM32F4、杜邦线&#xff08;彩色小电线&#xff09; * 8 、USB 转 TTL 0.认识设备 ST-link USB 转TTL STM32F4主板 1.连线 ST-Link连线 一共需要四根线 序号从左至右&#xff0c;从上至下进行编号 1 - 3.3V 连接 1&#xff08;黄色&#xff09;2- GND …

并发编程.

1、概述 1.1 进程和线程 进程&#xff1a;操作系统资源分配的最小单位。 程序由指令和数据组成&#xff0c;指令要执行&#xff0c;数据要读写&#xff0c;就必须将指令加载至cpu&#xff0c;数据加载至内存&#xff0c;在指令运行过程中还需要用到磁盘、网络等设备&#xff0…

python:并发编程(十八)

前言 本文将和大家一起探讨python并发编程的实际运用&#xff0c;会以一些我实际使用的案例&#xff0c;或者一些典型案例来分享。本文使用的案例是我实际使用的案例&#xff08;下篇&#xff09;&#xff0c;是基于之前效率不高的代码改写成并发编程的。让我们来看看改造的过…

计算逆波兰表达式

⭐作者介绍&#xff1a;大二本科网络工程专业在读&#xff0c;持续学习Java&#xff0c;努力输出优质文章 ⭐作者主页&#xff1a;逐梦苍穹 ⭐所属专栏&#xff1a;数据结构。数据结构专栏主要是在讲解原理的基础上拿Java实现 ⭐码云地址超链接(Gitee)&#xff1a;这里存放我学…

如何搭建Nginx网站服务

目录 一、首先搭建Nginx服务 二、授权的访问控制 第一步 安装依赖包 第二步 生成用户密码认证文件 第三步 修改文件属性和权限 第四步 修改配置文件 第五步 用浏览器测试网站 三、基于IP地址进行限制 第一步 修改配置文件 第二步 用两台设备进行访问测试 四、基于域…

工人规范操作识别系统 yolov5

工人规范操作识别系统通过yolov5python网络模型技术&#xff0c;工人规范操作识别系统对工人的操作进行实时监测&#xff0c;当工人规范操作识别系统检测到工人操作不符合规范时&#xff0c;将自动发出警报提示相关人员采取措施。YOLOv5中在训练模型阶段仍然使用了Mosaic数据增…