当前位置: 首页 > news >正文

C语言进阶【5】---数据在内存中的存储【2】(小数存储很难吗?)

本章概述

  • 本章引要
        • 练习
  • 浮点数的存储
  • 浮点数的取出
  • 小补充
  • 题目解析
  • 彩蛋时刻!!!

本章引要

常见的浮点数:3.1415,1E10等。其中,1E10是科学计数法的形式,它也就等于1*10^10小数数据类型:float ,double ,long double

练习

在开讲本章内容前,大家先来看个代码,大家先猜一下结果:

#define  _CRT_SECURE_NO_WARNINGS	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;
}

结果运行图:在这里插入图片描述
不知道大家猜对多少个答案?最起码要猜对两个答案吧。

浮点数的存储

在上面的代码中,n*pFloat指的是同一个空间里面的数据,但是两者取出来的数据差别很大说明两者的存储和取出数据的方式差别很大,整形的数据存储咱们已经讲过了,现在来讲一下浮点数的存储方式。
根据国际标准IEEE(电气和电子工程协会)754,任意一个二进制浮点数V可以表示成下面的形式:在这里插入图片描述
举个例子:

// 5.5 的二进制表示形式: 101.1
小数点前面: 1*2^2+0*2^1+1*2^0
小数点后面: 1*2^-1
小数就为:1*2^2+0*2^1+1*2^0+1*2^-1
我们知道,2^-1为0.5.
所以,小数点前面都是2的非负整数次方,小数点后面都是负整数次方。

小数存储的格式并不是我们所写的 101.1这个格式,而是按照上面的IEE754标准进行存储的。按照这个标准写的格式为:(-1)0 * 1.011* 22。其实就是个科学计数法的表现形式 。那么,按照上面的标准表示的话,S=0 ,M=1.011 ,E=2。在内存中,我们浮点数存储的有价值的数据就是S ,M和E

  • IEEE754标准规定如下
    • 对于32位的浮点数(32位机器平台),最高的1位存放的是符号位S紧跟着8位存储的是指数位E,再紧跟着的23位存储的有效值M。
    • 对于64位的浮点数(64位机器平台),最高的1位存放的是符号位S,紧跟着11位存储的是指数位E,在紧跟着52位存储的是有效值M。如图所示的存储图:在这里插入图片描述
  • IEEE754标准对E和M有些特殊规定:
    • M的特殊规定:由IEEE754标准规定,1<=M<2,也就是说所有的浮点数有效值位M必须是 1.xxxxxxx。其中 .xxxxx是小数位。IEEE754标准规定,在计算机中,对于有效值位M,只存储小数部分,整数部分的1省略(不进行存储)当读取数据的时候,再把1给加上。这样做,可以扩大小数的存储范围,使存储的精度增高
    • E的特殊规定由IEEE754标准规定的指数E是一个无符号整数(unsigned char类型),因为在浮点数的存储中,只有一个符号位,没有第二个符号位,所以,除了高位1位的符号位,剩下的全是数值位——E为无符号整形。在32位平台下的取值范围为0~255,在64位平台下的取值范围为0 ~2047.但是,我们知道,科学计数法中的指数是有负数的。比如:
0.5 的二进制表示 :0.1
IEEE754标准形式:(-1)^0*1* 2^-1
这个时候指数E就是负数 -1

为了符合科学计数的表现形式IEEE754标准规定,存入内存时,E的真实值必须再加上一个中间数,对于32位平台,这个中间数是127,对于64位平台,这个中间数是1023。比如(32位平台),2^10,E为10,我们存储的是:E+127=137,即10001001.

浮点数的取出

我们存储的是S,E和M,所以我们直接取出这三个值就OK了。然后,再按照IEEE754标准还原为小数,就可以得到我们想要的值了。对于,S和M这俩值的取出没什么特别的,正常取出就OK了,其中,别忘了取出M值的时候加上1.这里最特别的值是E,它的取值就要分三种情况讨论了,如下:

  • E不全为1或不全为0:我们取出E的值后,再减去127(32位平台)或者减去1023(64平台),才能得到真正的指数E(上面讲过了E的存储)。比如,0.5的存储。
0.5的二进制位 :0.1
IEEE745的形式:(-1)^0*1.0*2^-1    s=0 ,m=1.0 ,E=-1+127=126
0 01111110 00000000000000000000000 (小数部分全是0)
  • E全为0:当E的存储全为0的时候,IEEE745规定,原本的E=1-127=-126(32位平台)或E=1-1023(64位平台)。这个时候,有效值M不在加1,这样做是为了表示0或接近0的很小很小的小数。如下所示:。
0 00000000 00100000000000000000000
  • E全为1:这个时候说明这个小数是个很大很大的数。(正负取决于符号位S),如下所示:
0 11111111 0010000000000000000000

小补充

前面,咱们举的小数都是较容易表示二进制的。假如,我们举个较难表示的小数:5.54

5.5还是比较容易表示的 :101.1 
但是,0.04要怎样表示呢?2^-2结果是0.25,比0.04大太多了2^-3结果是0.125 ,比0.04大。………………

从上面的例子中,我想告诉大家的是:浮点数在内存中是无法精确存储的。所以,对于那些较难表示的小数,计算机会在后面多输出几位(或着四舍五入),以便接近你想要的数据

题目解析

上面讲了很多的知识铺垫了,咱们也该回归开头的那个练习题了。。

int n=9;
float *pFloat = (float *)&n;
printf("*pFloat的值为:%f\n",*pFloat);
9的存储: 00000000 00000000 00000000 00001001
当执行到这个代码的时候 printf("*pFloat的值为:%f\n",*pFloat);就会把9的存储格式
当成小数的存储格式(数据类型的意义)S    E            M
即  0 00000000 0000000000000000000100
是E全为0的情况,有效值M不再加1,所以是个接近0的小数,又因为在32位平台下,输出小数点后6位,
所以输出结果:0.000000
//----------------------------------------//
*pFloat = 9.0;printf("num的值为:%d\n",n);9.0的存储格式: 1001.0(-1)^0*1.0010*2^3         E=3+127=130S       E               M0  10000010 00100000000000000000000
执行到这个代码的时候 printf("num的值为:%d\n",n);就会被当成有符号整数(数据类型的意义)
即   01000001 00010000 00000000 00000000 (正整数:原码,反码和补码相同)
输出结果:1091567616

彩蛋时刻!!!


https://www.bilibili.com/video/BV1Zd4y1A7yc/?spm_id_from=333.337.search-card.all.click&vd_source=7d0d6d43e38f977d947fffdf92c1dfad
在这里插入图片描述
每章一句感到累的时候,请抬头看看天空。感谢你能看到这里,点赞+关注+收藏+转发是对我最大的鼓励,咱们下期见!!!

相关文章:

C语言进阶【5】---数据在内存中的存储【2】(小数存储很难吗?)

本章概述 本章引要练习 浮点数的存储浮点数的取出小补充题目解析彩蛋时刻&#xff01;&#xff01;&#xff01; 本章引要 常见的浮点数&#xff1a;3.1415&#xff0c;1E10等。其中&#xff0c;1E10是科学计数法的形式&#xff0c;它也就等于1*10^10。小数数据类型&#xff1…...

如何更新至CDS-Beta下载ERA5数据

数据下载网站 api 更新 api setup 更新api 2024年9月26日起老版的CDS将被停用&#xff0c;会搬迁到CDS-beta上。 创建一个新的CDS-beta账户&#xff0c;也可以使用之前的ECMWF账户。https://cds-beta.climate.copernicus.eu/vi ~/.cdsapirc &#xff0c;登陆https://cds-bet…...

SQL编程题复习(24/9/20)

练习题 x25 10-120 统计每个班级期末成绩的最高分&#xff08;Max&#xff09;&#xff0c;显示班级名称、期末最高成绩10-121 显示没有班导师的班级名称、院系名称10-122 将电子信息1班(班级编号&#xff1a;08)的班主任编号改为李丽清老师的编号&#xff08;PTA题目表述错误&…...

react crash course 2024 (1)理论概念

state的作用 react hooks 而无需写一个class jsx 样式用 spa...

有关JS下隐藏的敏感信息

免责声明&#xff1a;本文仅做分享&#xff01; 目录 JavaScript 介绍 核心组成 工具 FindSomething ** 浏览器检查 ** LinkFinder URLfinder ** SuperSearchPlus ** ffuf ParasCollector waymore Packer Fuzzer JS逆向 应用&#xff1a; 小结&#xff1a; Ja…...

Kafka 基于SASL/SCRAM动态认证部署,kafka加账号密码登录部署

文章目录 前言下载 kafka安装启动zookeeper添加账号密码 启动kafka修改kafka配置文件增加jaas授权文件修改启动文件&#xff0c;启动kafka检查是否部署成功 offset explore 连接 前言 其实挺简单的几个配置文件&#xff0c;问大模型一直没说到点上&#xff0c;绕晕了。SASL/SC…...

富格林:积攒经验阻挠欺诈套路

富格林指出&#xff0c;现货黄金这些年可谓是表现出色&#xff0c;相信上车现货黄金的投资者&#xff0c;都或多或少分得一杯满意的羹。不过话又说回来&#xff0c;不是所有投资者都可以轻松在现货黄金中获利&#xff0c;尤其是对投资小白而言&#xff0c;如果没有积累知识阻挠…...

51单片机-红外遥控器(NEC标准)-实验(红外遥控及调速电机)

作者&#xff1a;Whappy 时间&#xff1a;2024.9.20 总结一下&#xff01;基础实验到这儿里就圆满结束&#xff0c;历经25天&#xff0c;将51单片机学完并亲自手敲代码近5000行&#xff0c;在手敲代码过程中&#xff0c;明显感觉的看和敲&#xff0c;明显就是不同的感觉&…...

云手机的便捷性和安全性体现在哪?

随着5G技术的迅速发展&#xff0c;云手机在游戏、电商以及新媒体营销等领域中的应用日益广泛。它不仅能够显著降低成本、提升效率&#xff0c;还随着边缘计算和云技术的进步&#xff0c;展现出无限的增长潜力。 云手机的便捷性体现在哪里&#xff1f; 云手机的便捷性毋庸置疑。…...

漫谈由标准输入\输出\错误输出引发的思考

标准输入|输出|错误输出 在Unix\Linux体系中&#xff0c;一个进程通常自带有标准输入、标准输出、标准错误输出等三个文件描述符。 如果从对称的观点来看&#xff0c;它确实长的有点奇怪&#xff0c;但它背后隐藏了什么样的知识和道理呢&#xff1f; 从图灵机模型谈起 以前…...

利用 IDEA 快速管理 k8s 集群

简介 前置条件&#xff1a; minikube 已安装&#xff0c;JetBrains k8s 官方插件已安装&#xff0c;Helm 已安装&#xff0c;kubectl 已安装 打开插件面板 检查可执行文件 添加配置文件 添加集群 验证...

【自然语言处理】实验三:新冠病毒的FAQ问答系统

目录 前言 1.新建data_process.py 1.1导入包并定义功能模块1用来读取问题和答案FAQ的文件 1.2功能模块2&#xff1a;进行问题/问题列表处理&#xff08;正则化&#xff0c;分词&#xff09; 1.3功能模块3&#xff1a;处理输入的问题 1.4功能模块4&#xff1a;计算输入问题与问题…...

「C++系列」文件和流

【人工智能教程】&#xff0c;前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。 点击跳转到网站&#xff1a;【人工智能教程】 文章目录 一、文件和流1. 文件操作① 打开文件② 读写文件 2. 流操作 二、应…...

视频美颜SDK核心功能解析:打造高效直播美颜工具方案详解

随着直播行业的迅猛发展&#xff0c;用户对于直播画质和个人形象的要求越来越高。视频美颜SDK作为一项关键技术&#xff0c;已经成为各大直播平台和短视频应用的重要组成部分。通过实时美颜技术&#xff0c;用户能够在直播过程中呈现出更加理想的形象&#xff0c;从而提升直播体…...

深入解析:高性能 SSE 服务器的设计与实现

在当今的实时 Web 应用中&#xff0c;服务器发送事件&#xff08;Server-Sent Events&#xff0c;SSE&#xff09;技术扮演着越来越重要的角色。今天&#xff0c;我们将深入探讨一个用 Go 语言实现的高性能 SSE 服务器的设计和实现细节。这个服务器不仅能够处理大量并发连接&am…...

C#为任意组件开发登录功能的记录

非常简单&#xff0c;直接给出代码&#xff1a; 数据库操作类 这个无需多言就是简单的包含了数据操作的内容&#xff0c;允许你在这一个类中写完关于本地数据库或者云数据库操作的逻辑&#xff0c;与登录逻辑分开哦。 注意&#xff0c;如果你的软件要给别人运行使用&#xf…...

AI免费UI页面生成

https://v0.dev/chat v0 - UI设计 cursor - 编写代码 参考&#xff1a;https://www.youtube.com/watch?vIyIVvAu1KZ4 界面和claude类似&#xff0c;右侧展示效果和代码 https://pagen.so/...

2024新动态:低代码开发占领新常态市场

随着技术的不断进步和数字化转型的加速&#xff0c;企业对于快速开发和部署应用程序的需求日益增长。2024年&#xff0c;低代码开发平台已经成为新常态市场的重要力量&#xff0c;它通过简化应用程序的开发过程&#xff0c;让非技术背景的业务用户也能参与到软件开发中来&#…...

【SQL 用大白话描述事务并发 可能会遇到的问题】及解决策略

在SQL数据库中,当多个事务同时进行时,可能会出现并发事务问题。这些问题通常包括以下几种: 首先,我们要清楚一点,这些问题都是与事务的四大特性之一的隔离性有关。并且通常发生在并发事务场景中。 脏读(Dirty Read): 脏读发生在一个事务读取了另一个事务未提交的数据。…...

nginx安装及vue项目部署

安装及简单配置 在usr/local下建好nginx文件夹&#xff0c;下载好nginx-1.26.2.tar.gz压缩文件.安装编译工具及库文件 yum -y install make zlib zlib-devel gcc-c libtool openssl openssl-devel pcre-devel gcc、gcc-c # 主要用来进行编译相关使用 openssl、ope…...

前端倒计时误差!

提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

FastAPI 教程:从入门到实践

FastAPI 是一个现代、快速&#xff08;高性能&#xff09;的 Web 框架&#xff0c;用于构建 API&#xff0c;支持 Python 3.6。它基于标准 Python 类型提示&#xff0c;易于学习且功能强大。以下是一个完整的 FastAPI 入门教程&#xff0c;涵盖从环境搭建到创建并运行一个简单的…...

Java - Mysql数据类型对应

Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI

前一阵子在百度 AI 开发者大会上&#xff0c;看到基于小智 AI DIY 玩具的演示&#xff0c;感觉有点意思&#xff0c;想着自己也来试试。 如果只是想烧录现成的固件&#xff0c;乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外&#xff0c;还提供了基于网页版的 ESP LA…...

【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】

1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件&#xff08;System Property Definition File&#xff09;&#xff0c;用于声明和管理 Bluetooth 模块相…...

ETLCloud可能遇到的问题有哪些?常见坑位解析

数据集成平台ETLCloud&#xff0c;主要用于支持数据的抽取&#xff08;Extract&#xff09;、转换&#xff08;Transform&#xff09;和加载&#xff08;Load&#xff09;过程。提供了一个简洁直观的界面&#xff0c;以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

k8s业务程序联调工具-KtConnect

概述 原理 工具作用是建立了一个从本地到集群的单向VPN&#xff0c;根据VPN原理&#xff0c;打通两个内网必然需要借助一个公共中继节点&#xff0c;ktconnect工具巧妙的利用k8s原生的portforward能力&#xff0c;简化了建立连接的过程&#xff0c;apiserver间接起到了中继节…...

2023赣州旅游投资集团

单选题 1.“不登高山&#xff0c;不知天之高也&#xff1b;不临深溪&#xff0c;不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...

算法笔记2

1.字符串拼接最好用StringBuilder&#xff0c;不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...

TSN交换机正在重构工业网络,PROFINET和EtherCAT会被取代吗?

在工业自动化持续演进的今天&#xff0c;通信网络的角色正变得愈发关键。 2025年6月6日&#xff0c;为期三天的华南国际工业博览会在深圳国际会展中心&#xff08;宝安&#xff09;圆满落幕。作为国内工业通信领域的技术型企业&#xff0c;光路科技&#xff08;Fiberroad&…...