C语言浮点型数据在内存中的存储及取出等的介绍

文章目录

  • 前言
  • 一、浮点型在内存中的存储
  • 二、浮点数存储规则
  • 三、浮点数在内存中的存储(32位)float类型
  • 四、浮点数在内存中的存储(64位)double类型
  • 五、指数E从内存中取出分成三种情况
    • 1. E不全为0或不全为1
    • 2. E全为0
    • 3. E全为1
  • 六、有关案例
  • 总结


前言

C语言浮点型数据在内存中的存储及取出、有关案例等的介绍

一、浮点型在内存中的存储

  • 浮点型数据的范围是在 float.h 头文件中定义的。
  • 整型的数据的范围是在 limits.h 头文件中定义的。

二、浮点数存储规则

  • 浮点数的二进制位中,小数点后面数字的权重从2-1 ----> 2-2 ------>…等逐渐变化。

  • 因此若表示5.5 则二进制表示方法位 101.1, 即为5.5。

  • 但是,若表示5.6,101.11大于5.6, 101.101也大于5.6。

  • 所以表示5.6 需要很多位0或1来凑,所以浮点数不能精确表示有些值,只能近似表示。
    在这里插入图片描述

  • IEEE 754 规定

  • 任何一个浮点数都可以表示成 -1S × M × 2E

  • S 若为0, 则为正数,若为1,则为负数

  • E指的是把M表示成科学计数法,小数点移动的位数, 类似于10进制科学计数法

  • M是一个 大于等于1并且小于 2 的数字

  • 所以浮点数在内存中存储的是 S M E 相关的值

三、浮点数在内存中的存储(32位)float类型

  • 最高位存储 S符号位
  • 中间8位存储E的值
  • E 是一个无符号整型的值float类型范围为0 - 255,但是实际情况中E的值可能为负
  • 所以 标准规定,存入E的值时,用 E 的值 加 中间数来进行修正
  • float 类型的中间数是 127.
  • M 是有效数字在1 - 2 之间
  • 但是存储时,只存储小数点后面的,不存储1,在使用时加上1即可。

四、浮点数在内存中的存储(64位)double类型

  • 最高位存储 S 即符号位
  • 中间11位存储E的值
  • E 是一个无符号整型的值double类型范围为0 - 2047,但是实际情况中E的值可能为负
  • 所以 标准规定,存入E的值时,用 E 的值 加 中间数来进行修正
  • double 类型的中间数是 1023.
  • M 是有效数字在1 - 2 之间
  • 但是存储时,只存储小数点后面的,不存储1,在使用时加上1即可。

在这里插入图片描述

五、指数E从内存中取出分成三种情况

1. E不全为0或不全为1

  • 这是浮点数就采用如下规则
  • 指数E的计算值减去127(或1023),得到真实值,再将有效数字M前加上第一位1。
  • 例如
5.5 二进制位 101.1
表示成标准形式为 -1^0 * 1.011 * 2^2
- 存入数据时:
	存入S 为 0
	存入的E为 2 + 127 = 129 二进制为 10000001
	存入M为 011 但需要在后面进行补0,至23位或52位
	即 01100000000000000000000
	所以存入的数据表示为
	0 10000001 01100000000000000000000
	E 的部分不全为0 或不全为1
- 取出数据时:
	S 不变 S = 0
	E 由存入的计算值减127得到真实值 2 
	M 加上 11.01100000000000000000000
	
	所以取出为
	-1^0 * 1.01100000000000000000000 * 2^2 // 5.5

2. E全为0

  • 存入的E 全为0,则说明,标准形式中2 的指数非常接近 -127,说明此时的数字非常小。
  • 所以标准规定 此时 E1-127(或1 - 1023)M不再加上第一位的1,而是直接还原为0.xxxxxxx,表示**±0以及接近于0的很小的数字**。

3. E全为1

  • 存入的E 全为1,则说明,标准形式中2 的指数非常接近 128,说明此时的数字非常大。
  • 这时,如果有效数字M全为0, 表示±无穷大(正负取决于S)。

六、有关案例

#include <stdio.h>
int main()
{
	int n = 9;
	float* pFloat = (float*)&n;

	printf("n的值为: %d\n", n); // 9
	// 9 的二进制序列为
	// 00000000000000000000000000001001
	// 以浮点型取出
	// 0 00000000 00000000000000000000100
	// E 全为0 结果为 0.000000
	// 以浮点型进行存储
	// -1^0 * 1.001 * 2^3
	// 0 10000010 00100000000000000000000
	// 以整型打印
	// 01000001000100000000000000000000 // 一个很大的数
	// 以浮点型打印
	// -1^0 * 1.001 * 2^3 // 9.0
	printf("*pFloat的值为: %f\n", *pFloat);// 0.000000
	*pFloat = 9.0;
	printf("num的值为: %d\n", n); // 1091567616
	printf("*pFloat的值为: %f\n", *pFloat); // 9.000000

	return 0;
}

总结

C语言浮点型数据在内存中的存储及取出、有关案例等的介绍

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

设计模式之工厂模式FactoryPattern(二)

一、简单工厂 package com.xu.demo.factoryPattern;/*** 简单工厂模式类*/ public class SimpleFactoryPattern {public static Phone create(String name) {//根据输入对象名称判断返回相匹配的对象if("IPhone".equals(name)) {//返回对象return new IPhone();}else…

Java算法--队列

队列 队列介绍 队列是一个有序列表&#xff0c;可以用数组或是链表来实现。遵循先入先出的原则。即&#xff1a;先存入队列的数据&#xff0c;要先取出。后存入的要后取出 数组模拟队列思路 队列本身是有序列表&#xff0c;若使用数组的结构来存储队列的数据&#xff0c;则…

自动驾驶新书“五一”节马上上市了

我和杨子江教授合写的《自动驾驶系统开发》终于在清华大学出版社三校稿之后即将在五一节后出版。 清华大学汽车学院的李克强教授和工程院院士撰写了序言。 该书得到了唯一华人图灵奖获得者姚期智院士、西安交大管晓宏教授和科学院院士以及杨强教授和院士等的推荐&#xff0c;…

git变更远端仓库名之后如何修改本地仓库配置的另一种方法?(删remote指针、添加、绑定master)

背景 如果某个远端的仓库地址变化后&#xff0c;本地仓库可以修改对应的remote。 之前谈过几种方法&#xff0c;比如重新设置一个新的remote的指针&#xff0c;绑定到新地址。然后删除origin&#xff0c;然后把新指针mv到origin。比如直接seturl修改&#xff08;git remote se…

基于HTML+CSS+JavaScript的表白网页

基于HTMLCSSJavaScript的表白网页 前言效果截图&#xff08;为GIF格式&#xff09;部分代码领取源码下期更新预报 前言 大部分人都有喜欢的人&#xff0c;学会这个表白代码&#xff0c;下次表白你肯定会成功。 效果截图&#xff08;为GIF格式&#xff09; 部分代码 index.htm…

使用 Python 和 DirectShow 从相机捕获图像

在 Python 中使用 OpenCV 是视觉应用程序原型的一个非常好的解决方案,它允许您快速起草和测试算法。处理从文件中读取的图像非常容易,如果要处理从相机捕获的图像,则不那么容易。OpenCV 提供了一些基本方法来访问链接到 PC 的相机(通过对象),但大多数时候,即使对于简单的…

在no branch上commit后,再切换到其他分支,找不到no branch分支的修改怎么办?

解决办法 通过git reflog我们可以查看历史提交记录&#xff0c;这里的第二条提交&#xff08;fbd3ea8&#xff09;就是我在no branch上的提交。 再通过git checkout -b backup fbd3ea8&#xff0c;恢复到上次提交的状态&#xff0c;并且为其创建个分支backup&#xff0c;此时…

B+tree - B+树深度解析+C语言实现+opencv绘图助解

Btree - B树深度解析C语言实现opencv绘图助解 1. 概述2. Btree介绍3. Btree算法实现3.1 插入分裂 3.2 删除向右借位&#xff08;左旋&#xff09;向左借位&#xff08;右旋&#xff09;合并 3.3 查询和遍历3.3.1 查询3.3.2 遍历 3.4 优化优化1(匀key)优化2(升级key)优化3(拓展兄…

池化整合多元数据库,zData X 一体机助力证券公司IT基础架构革新

引言 近期&#xff0c;云和恩墨 zData X 多元数据库一体机&#xff08;以下简称 zData X&#xff09;在某证券公司的OA、短信和CRM业务系统中成功上线&#xff0c;标志着其IT基础架构完成从集中式存储向池化高性能分布式存储的转变。zData X 成功整合了该证券公司使用的达梦、O…

SEO之链接原理(三)

初创企业需要建站的朋友看这篇文章&#xff0c;谢谢支持&#xff1a; 我给不会敲代码又想搭建网站的人建议 &#xff08;接上一篇&#xff09; 4、 Google PR PR是 PageRank 的缩写。Google PR理论是所有基于链接的搜索引擎理论中最有名的。 PR是Google创始人之一拉里佩奇发明…

二维数组打印菱形(C语言)

一、N-S流程图&#xff1b; 二、运行结果&#xff1b; 三、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>int main() {//初始化变量值&#xff1b;char arr[5][5] { { , , *, , }, { , *, *, *, },{*, *, *, *, *}, { , *, *, *, …

【基于BP神经网络的多输入分类预测】

文章目录 前言环境准备导入数据划分训练集和测试集数据归一化建立模型设置训练参数训练网络仿真测试数据反归一化和排序性能评价结果可视化混淆矩阵 前言 在数据科学和机器学习领域&#xff0c;对复杂数据集进行高精度的分类预测是一个常见且关键的任务。本文通过MATLAB代码示例…

python3GUI--本地简易音乐播放器By:PyQt5(附下载地址)

文章目录 二&#xff0e;展示1.启动2.添加音乐&播放3.软件风格 三&#xff0e;软件整体功能-览四&#xff0e;实现原理1.界面设计2.音频播放3.打包 五&#xff0e;总结 博客二连发&#xff0c;继续为大家带来我使用PyQt5开发的软件&#xff0c;本次为大家分享我写的一款本地…

MySQL数据库常见SQL语句宝典

一 、常用操作数据库的命令 1.查看所有的数据库 : show databases;2.创建一个数据库 : create database if not exists 数据库名;3.删除一个数据库 : drop database if exists 数据库名;4.选择一张表 (注意在建表之前必须要选择数据库) : use 表名;* --tab 键的上面&#x…

如何我现在是本地的文件路径不是http,用html如何打开

--别给我BB 如何我现在是本地的文件架路径不是http&#xff0c;用html如何打开? 答&#xff1a; 如果你想在HTML中打开本地文件路径的视频&#xff0c;可以使用file://协议。假设你的视频文件在本地的路径为/path/to/your/video.mp4&#xff0c;那么你可以将src属性设置为file…

ULTIMATE VOCAL REMOVER V5 for Mac:专业人声消除软件

ULTIMATE VOCAL REMOVER V5 for Mac是一款专为Mac用户设计的人声消除软件&#xff0c;它凭借强大的功能和卓越的性能&#xff0c;在音乐制作和后期处理领域崭露头角。 ULTIMATE VOCAL REMOVER V5 for Mac v5.6激活版下载 这款软件基于深度神经网络&#xff0c;通过先进的训练模…

关于win11如何打开Hyper-V详解

文章目录 概要一、安装Hyper-V二、启用Hyper-V 概要 我是想要在win11家庭版用docker部署一个&#xff0c;gpt大模型&#xff0c;一开始走了很多弯路&#xff0c;因为要打开Hyper-V&#xff0c;所以我搜集到了一个方法&#xff0c;因为一般win11家庭版的Hyper-v是默认隐藏的&am…

rust前端web开发框架yew使用

构建完整基于 rust 的 web 应用,使用yew框架 trunk 构建、打包、发布 wasm web 应用 安装后会作为一个系统命令&#xff0c;默认有两个特性开启 rustls - 客户端与服务端通信的 tls 库update_check - 用于应用启动时启动更新检查&#xff0c;应用有更新时提示用户更新。nati…

redis基础(一)

启动与关闭 启动命令在/usr/local/bin目录 服务端后台启动&#xff1a;redis-server opt/redis-6.2.1/redis.conf 客户端连接&#xff1a;执行 redis-cli 关闭操作 ​ 方式1&#xff1a;进入终端后关闭 ​ 方式2&#xff1a;直接kill 掉进程 方式3&#xff1a;通过实例关闭 …

C++高级特性:C/C++内存结构模型(十一)

1、内存结构 C/C语言一只被认为是一种底层语言&#xff0c;与其他语言不一样&#xff0c;对内存结构理解是C/C程序员从入门到入土的开端。 其他编程语言对内存管理是透明的&#xff0c;程序员无序关心可以认为是一个黑盒&#xff1b;而C/C不一样理解好内存结构有利于编写健壮性…