C语言-整数和浮点数在内存中的存储-详解-下

news2024/9/21 14:28:16

C语言-整数和浮点数在内存中的存储-详解-下

  • 1.前言
  • 2.浮点数
    • 2.1IEEE 754 标准
    • 2.2存储格式
      • 存储细节
      • 取出
  • 3.相关代码的解释

1.前言

在C语言-整数和浮点数在内存中的存储-详解-上中,我通过一个简单的例子展示了整数和浮点数在内存中的存储差异,并详细介绍了整数在内存中的存储。
本文将继续探讨浮点数在内存中的具体存储方式,并解释相关代码的运行结果。
示例代码回顾

#include <stdio.h>
int main()
{
	int n = 5.5;
	float* p = (float*)&n;
	printf("%d\n", n);
	printf("%f\n", *p);
	*p = 5.5;
	printf("%d\n", n);
	printf("%f\n", *p);
	return 0;
}

这段代码的运行结果如下:

5
0.000000
1085276160
5.500000

在上一篇文章中,我已经解释了这是由于整数和浮点数在内存中的存储方式不同所导致的。
本篇,我将详细介绍浮点数在内存中的存储,并解释上面代码的结果是如何得到的。

2.浮点数

2.1IEEE 754 标准

谈到浮点数的存储,永远离不开 IEEE 754

IEEE二进制浮点数算术标准(IEEE 754)是20世纪80年代以来最广泛使用的浮点数运算标准,为许多CPU与浮点运算器所采用。这个标准定义了表示浮点数的格式(包括负零-0)与反常值(denormal number)),一些特殊数值(无穷(Inf)与非数值(NaN)),以及这些数值的“浮点数运算符”;它也指明了四种数值舍入规则和五种例外状况(包括例外发生的时机与处理方式)。

根据其规定,任意一个二进制浮点数V都可以表示成以下形式:
V = ( − 1 ) S ∗ M ∗ 2 E V = (-1)^S*M*2^E V=(1)SM2E
其中:

  • ( − 1 ) S (-1)^S (1)S用于表示符号, S S S 的值为 01
  • M M M表有效数据,且 1 ≤ M < 2 1\le M < 2 1M<2
  • 2 E 2^E 2E,表指数,类似科学计数法中的 1 0 x 10^x 10x

下面举几个简单的例子:

  • V = 5.5:
    5.5 = 4 + 1 + 0.5 = 2 2 + 2 0 + 2 − 1 5.5=4+1+0.5=2^2+2^0+2^{-1} 5.5=4+1+0.5=22+20+21,因此,V二进制表示形式为101.1
    V = ( − 1 ) 0 ∗ 1.011 ∗ 2 2 V = (-1)^0*1.011*2^2 V=(1)01.01122
    S = 0;M = 1.011 ;E = 2

  • V = -0.5:
    − 0.5 = − 2 − 1 -0.5=-2^{-1} 0.5=21,因此,V二进制表示形式为-0.1
    V = ( − 1 ) 1 ∗ 1.0 ∗ 2 − 1 V = (-1)^1*1.0*2^{-1} V=(1)11.021
    S = 1;M = 1.0 ;E = -1

2.2存储格式

当规定了怎么表示浮点数后,IEEE754又规定了浮点数的具体存储格式:

  • 单精度浮点数:使用32个比特存储。
    其中,符号位 ( S ) 占第1个比特位,指数位 ( E ) 占接下来的8个比特位,尾数位 ( M )占最后的23个比特位。
  • 双精度浮点数:使用64个比特存储。
    其中,符号位 ( S ) 占第1个比特位,指数位 ( E ) 占接下来的11个比特位,尾数位 ( M )占最后的52个比特位。
    在这里插入图片描述

存储细节

上面的图中清晰的给出了 S S S M M M E E E的位置,但是对于 M M M E E E的具体存储过程,IEEE754还有一些特殊的规定。
M
前面说过: M M M表有效数据,且 1 ≤ M < 2 1\le M < 2 1M<2
即对于任意的 M M M,都可表示为1.xxx,因此,IEEE754规定,在存储的过程中,不会存储小数点前面的1,而只存储小数点后的数位。
例如:float n = 5.5;时, M M M1.011,在存储时,则只保留011

E
首先需要注意的是, E E E是一个无符号整数。
这意味着,在单精度浮点数中, E E E8位,它的取值范围是0~255 ;在双精度浮点数中, E E E11位,它的取值范围是0~2047
而为了表示 E E E为负数的情况,IEEE754规定,在 E E E存入内存前必须加上一个中间数:8位的是127,11位的是1023
例如:float n = 5.5;时, E E E为2,在存储时,必须保存为2+127=129,即1000 0001。

取出

在取出时,可大致根据 E E E的不同分为三种情况:
E不为全0或全1
取出时需将 E E E减去一个中间数得到原始值,再带入公式计算。
E为全0
表示正/负0。
E为全1
表示正/负无穷。

3.相关代码的解释

回到开头:

int n = 5.5;

n被赋值为5,此时是整型:
在这里插入图片描述


float* p = (float*)&n;

使用指向浮点型的指针p指向n,此时,*p为浮点型:
在这里插入图片描述


printf("%d\n", n);
printf("%f\n", *p);

第一次打印,n为整型,打印的是整型,结果为:

5

第二次打印,*p为浮点型,打印的是浮点型,由于E为全0,表示的值为0,结果为:

0.000000

*p = 5.5;

*p被赋值为5.5,由于*p是浮点型,因此按浮点数的方式存储:
在这里插入图片描述


printf("%d\n", n);
printf("%f\n", *p);

第三次打印,将n看做整数打印,运行结果如下:

1085276160

在这里插入图片描述
第四次打印,打印浮点数,结果为:

5.500000


希望本篇文章对你有所帮助!并激发你进一步探索C语言的兴趣!
本人仅是个C语言初学者,如果你有任何疑问或建议,欢迎随时留言讨论!让我们一起学习,共同进步!

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

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

相关文章

Java重修笔记 第五十六天 坦克大战(六)多线程基础 - 线程同步、死锁

多线程同步机制 多线程编程中&#xff0c;一些敏感数据可能会被多个线程同时访问造成数据混乱&#xff08;例如票数&#xff09;&#xff0c;使用线程同步机制&#xff0c;通过锁对象&#xff08;对象实例或类实例&#xff09;的方式来保证该段代码在任意时刻&#xff0c;最多…

TCP socket

TCP的socket和UDP大同小异&#xff0c;基本的代码结构都是相同的。一些相同的接口本文就不赘述了&#xff0c;例如&#xff0c;socket,bind&#xff0c;有需要看这篇文章UDP socket 服务端server 两步&#xff1a;初始化服务端&#xff0c;运行服务端 初始化服务端 创建soc…

Java项目基于docker 部署配置

linux新建文件夹 data cd datatouch Dockerfilesudo vim Dockerfile# 使用一个基础的 Java 镜像&#xff08;根据自己项目中使用的是什么jdk版本设置&#xff0c;用于拉取执行jar包的jdk环境&#xff09; FROM openjdk:8# 指定工作目录 VOLUME /data# 复制应用程序的 JAR 文件…

Redis模拟消息队列实现异步秒杀

目录 一、消息队列含义 二、Redis实现消息队列 1、基于List的结构模拟实现消息队列 2、基于PubSub的消息队列 3、基于Stream的消息队列 4、基于Stream的消息队列- 消费者组 一、消息队列含义 消息队列&#xff08;Message Queue&#xff09;&#xff0c;字面意思就是存放…

基于SpringBoot的招生宣传管理系统【附源码】

基于SpringBoot的招生宣传管理系统&#xff08;源码L文说明文档&#xff09; 目录 4 系统设计 4.1 系统概述 4.2系统功能结构设计 4.3数据库设计 4.3.1数据库E-R图设计 4.3.2 数据库表结构设计 5 系统实现 5.1管理员功能介绍 5.1.1管理员登录 …

【JavaScript】LeetCode:36-40

文章目录 36 两数相加37 删除链表的倒数第n个节点38 两两交换链表中的节点39 k个一组翻转链表40 随机链表的复制 36 两数相加 创建一个新的链表&#xff08;哨兵节点指向&#xff09;&#xff0c;这个链表用来表示两个数相加后的和。从个位开始相加&#xff0c;每次都向新链表尾…

PCL 点云随机渲染颜色

目录 一、概述 1.1原理 1.2实现步骤 1.3 应用场景 二、代码实现 2.1关键函数 2.2完整代码 三、实现效果 PCL点云算法汇总及实战案例汇总的目录地址链接&#xff1a; PCL点云算法与项目实战案例汇总&#xff08;长期更新&#xff09; 一、概述 本文将介绍如何使用PCL库…

PMP–一、二、三模–分类–14.敏捷–技巧–项目生命周期

文章目录 技巧项目生命周期 一模14.敏捷--项目生命周期--原型法--迭代型生命周期&#xff0c;通过连续的原型或概念验证来改进产品或成果。每个新的原型都能带来新的干系人新的反馈和团队见解。题目中明确提到需要反馈&#xff0c;因此原型法比较好用。23、 [单选] 一个敏捷团队…

DAY13信息打点-Web 应用源码泄漏开源闭源指纹识别GITSVNDS备份

#知识点 0、Web架构资产-平台指纹识别 1、开源-CMS指纹识别源码获取方式 2、闭源-习惯&配置&特性等获取方式 3、闭源-托管资产平台资源搜索监控 演示案例&#xff1a; ➢后端-开源-指纹识别-源码下载 ➢后端-闭源-配置不当-源码泄漏 ➢后端-方向-资源码云-源码泄漏 …

Linux下的简单TCP客户端和服务器

客户端 #include <arpa/inet.h> #include <stdlib.h> #include <stdio.h> #include <string.h> #include <unistd.h> #include <sys/socket.h>int main() {struct sockaddr_in* caddr(struct sockaddr_in*)malloc(sizeof(struct sockaddr…

【JavaEE】IO基础知识及代码演示

目录 一、File 1.1 观察get系列特点差异 1.2 创建文件 1.3.1 delete()删除文件 1.3.2 deleteOnExit()删除文件 1.4 mkdir 与 mkdirs的区别 1.5 文件重命名 二、文件内容的读写----数据流 1.1 InputStream 1.1.1 使用 read() 读取文件 1.2 OutputStream 1.3 代码演示…

【有啥问啥】自动提示词工程(Automatic Prompt Engineering, APE):深入解析与技术应用

自动提示词工程&#xff08;Automatic Prompt Engineering, APE&#xff09;&#xff1a;深入解析与技术应用 引言 随着大语言模型&#xff08;LLM&#xff09;如 GPT、BERT 等的快速发展&#xff0c;如何高效地与这些模型进行互动成为了重要的研究方向之一。提示词&#xff…

阿里P8和P9级别有何要求

阿里巴巴的P8和P9级别&#xff0c;代表着公司的资深技术专家或管理者岗位&#xff0c;要求候选人具有丰富的职业经历、深厚的技术能力以及出色的领导力。以下是对P8和P9级别的要求、考察点以及准备建议的详细分析。 P8 级别要求 1. 职业经历&#xff1a; 8年以上的工作经验&a…

PCIe进阶之TL:Common Packet Header Fields TLPs with Data Payloads Rules

1 Transaction Layer Protocol - Packet Definition TLP有四种事务类型:Memory、I/O、Configuration 和 Messages,两种地址格式:32bit 和 64bit。 构成 TLP 时,所有标记为 Reserved 的字段(有时缩写为 R)都必须全为0。接收者Rx必须忽略此字段中的值,PCIe Switch 必须对…

响应式网站的网站建设,需要注意什么?

响应式网站建设需要注意多个方面&#xff0c;以确保网站能够在各种设备和屏幕尺寸上提供一致且良好的用户体验。下面详细介绍响应式网站建设的注意事项&#xff1a; 响应式网站的网站建设&#xff0c;需要注意什么? 考虑多终端适配 设计样式&#xff1a;在设计响应式网站时&…

豆包MarsCode | 一款智能编程助手开发工具

豆包MarsCode | 一款智能编程助手开发工具 豆包MarsCode 是基于豆包大模型的智能开发工具&#xff0c;提供 Cloud IDE 和 AI 编程助手&#xff0c;支持代码补全、智能问答、代码解释与修复&#xff0c;兼容主流编程工具与 100 种编程语言&#xff0c;助力编程更智能便捷 豆包 M…

InterPro蛋白质结构域数据下载

前言 偶然发现InterPro数据库挺不错的。 之前使用selenium爬取了AlphaFlod数据&#xff0c;于是也想试试把InterPro的结构域数据爬取一下。 结果发现官方已经给好了代码&#xff0c;真是太善解人意了。 当然&#xff0c;想要批量下载还需要魔改一下官方代码。 步骤一&#…

【初阶数据结构】排序

目录 一、排序的概念及其运用 1.1排序的概念 1.2常见的排序算法 二、常见排序算法的实现 2 .1插入排序 2 .1.1基本思想&#xff1a; 2.1.2直接插入排序&#xff1a; 算法复杂度&#xff1a; 最坏情况&#xff1a; 最好的情况&#xff1a; 直接插入排序的特性总结&…

思维商业篇(2)—业务第一性

思维商业篇(2)—业务第一性 前言 第一性原理是超过因果律的第一因&#xff0c;且是唯一因。 第一性原理是事物唯一的源头&#xff0c;是抽象。是看透事物的本质&#xff0c;要把事物分解成最基本的组成&#xff0c;从源头上去解决问题。 对于一个企业来说&#xff0c;第一性…

01,大数据总结,zookeeper

1 &#xff0c;zookeeper &#xff1a;概述 1.1&#xff0c;zookeeper&#xff1a;作用 1 &#xff0c;大数据领域 &#xff1a;存储配置数据   例如&#xff1a;hadoop 的 ha 配置信息&#xff0c;hbase 的配置信息&#xff0c;都存储在 zookeeper 2 &#xff0c;应用领…