整数和浮点数分别在内存中的存储

目录

  • 一、整数在内存中的存储
  • 二、浮点数在内存中的存储
    • 2.1存储
    • 2.2取
      • 2.2.1 E不全为0或者不全为1
      • 2.2.2 E全为0
      • 2.2.3 E全为1
  • 三、题目解析

一、整数在内存中的存储

对于整形来说:数据存放内存中其实存放的是补码。
原因在于,使用补码,可以将符号位和数值域统⼀处理;
同时,加法和减法也可以统⼀处理(CPU只有加法器)此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。
链接: link
我这里讲移位操作符的时候有讲到原码,反码,补码之间的转换。
这篇博客最主要讲一下浮点数是如何在内存中存储的。

二、浮点数在内存中的存储

常见的浮点数:3.14159、1E10等,浮点数家族包括: 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;
}

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

这个运行的结果,和我想的不一样,第二个我想的是9.0,第三个我想的是9,为什么不对呢?这就说明浮点数在内存中的存储是不一样的。
上⾯的代码中, num 和 *pFloat 在内存中明明是同⼀个数,为什么浮点数和整数的解读结果会差别这么大?
要理解这个结果,⼀定要搞懂浮点数在计算机内部的表示方法。
根据国际标准IEEE(电气和电子工程协会) 754,任意⼀个二进制浮点数V可以表示成下面的形式:
V = (−1)^ S *M ∗ 2^E
• (−1)S 表示符号位,当S=0,V为正数;当S=1,V为负数
• M 表示有效数字,M是大于等于1,小于2的
• 2^E 表示指数位
举例来说:
⼗进制的5.0,写成⼆进制是 101.0 ,相当于 1.01×2^2 。
那么,按照上⾯V的格式,可以得出S=0,M=1.01,E=2。
十进制的-5.0,写成⼆进制是 -101.0 ,相当于 -1.01×2^2 。那么,S=1,M=1.01,E=2。
IEEE 754规定:
对于32位(float)的浮点数,最⾼的1位存储符号位S,接着的8位存储指数E,剩下的23位存储有效数字M
在这里插入图片描述
对于64位(double)的浮点数,最⾼的1位存储符号位S,接着的11位存储指数E,剩下的52位存储有效数字M
在这里插入图片描述

2.1存储

IEEE 754 对有效数字M和指数E,还有⼀些特别规定
前⾯说过, 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,所以保存成32位浮点数时,必须保存成10+127=137,即10001001。

2.2取

指数E从内存中取出还可以再分成三种情况:

2.2.1 E不全为0或者不全为1

这时,浮点数就采⽤下⾯的规则表示,即指数E的计算值减去127(或1023),得到真实值,再将有效数字M前加上第⼀位的1。
比如:0.5 的⼆进制形式为0.1,由于规定正数部分必须为1,即将小数点右移1位,则为1.0*2^(-1),其阶码为-1+127(中间值)=126,表示为01111110而尾数1.0去掉整数部分为0,补齐0到23位 00000000000000000000000,则其⼆进制表示形式为:

0 01111110 00000000000000000000000

2.2.2 E全为0

这时,浮点数的指数E等于1-127(或者1-1023)即为真实值,有效数字M不再加上第⼀位的1,而是还原为0.xxxxxx的小数。这样做是为了表示±0,以及接近于0的很小的数字。

0 00000000 00100000000000000000000

2.2.3 E全为1

这时,如果有效数字M全为0,表示±无穷大(正负取决于符号位s)

0 11111111 00010000000000000000000

三、题目解析

再让我们回到一开始给的代码:

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

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
欧耶!!!我学会啦!!!!!!

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

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

相关文章

Redis 6和7:探索新版本中的新特性

码到三十五 &#xff1a; 个人主页 心中有诗画&#xff0c;指尖舞代码&#xff0c;目光览世界&#xff0c;步履越千山&#xff0c;人间尽值得 ! Redis&#xff0c;作为开源的内存数据结构存储系统&#xff0c;以其高性能、丰富的数据结构和广泛的应用场景而深受开发者喜爱。随…

面试题:Java中的类加载器

1. 什么是类加载器&#xff0c;类加载器有哪些? 要想理解类加载器的话&#xff0c;务必要先清楚对于一个Java文件&#xff0c;它从编译到执行的整个过程。 类加载器&#xff1a;用于装载字节码文件(.class文件)运行时数据区&#xff1a;用于分配存储空间执行引擎&#xff1a;…

Zabbix学习(二)

上一篇文章中&#xff0c;我们搭建完了zabbix服务端和客户端&#xff0c;这一章介绍下具体的使用&#xff0c;下面先介绍几个概念。 主机&#xff1a;要监控的主机监控项&#xff1a;你要监控cpu还是内存触发器&#xff1a;当cpu使用率超过多少报警动作&#xff1a;cpu报警了&…

Python安装手册

Python安装手册 一、基本说明二、版本对比三、Python解析器 一、基本说明 Python是一种跨平台的计算机程序设计语⾔。 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语⾔。 最初被设计用于编写⾃动化脚本Shell&#xff08;适用于Linux操作系统&#xff09;&am…

设计模式|工厂模式

文章目录 1. 工厂模式的三种实现2. 简单工厂模式和工厂方法模式示例3. 抽象工厂模式示例4. 工厂模式与多态的关系5. 工程模式与策略模式的关系6. 面试中可能遇到的问题6.1 **工厂模式的概念是什么&#xff1f;**6.2 **工厂模式解决了什么问题&#xff1f;**6.3 **工厂模式的优点…

【Objective -- C】—— GCD(1)(Grand Central Dispatch)

【Objective -- C】—— GCD&#xff08;1&#xff09;&#xff08;Grand Central Dispatch&#xff09; GCD1. 什么是GCD2.多线程编程线程多线程的理解多线程的优点 3.任务和队列任务同步执行和异步执行 队列串行队列和并发队列 GCD的API1.Dispatch QueueDispatch Queue的分类…

客户管理系统功能大揭秘!助您了解其核心作用!

早在2019年&#xff0c;中国已经快速迈向服务经济时代 客户管理一直是各行业管理者关心的话题&#xff0c;在数字化时代&#xff0c;如何做好客户管理&#xff1f;很多人说可以尝试客户管理系统&#xff0c;那么今天大家就一窥客户管理系统的庐山真面目。 一、什么是客户管理系…

复试编程练习题(from 牛客网)

考试时候可能没有VS,但codeblocks是必备的。 下面总结一些常用的快捷键。 CtrlEnter&#xff1a;光标移至行尾ShiftEnter&#xff1a;光标跳到下一行CtrlD&#xff1a;直接复制粘贴当前行CtrlL&#xff1a;删除当前行F9&#xff1a;buildrun。CtrlShiftC&#xff1a;注释掉当…

网络安全实训Day9

写在前面 访问控制和防火墙桌面端安全检测与防御 网络安全实训-网络安全技术 网络安全概述 访问控制 定义&#xff1a;通过定义策略和规则来限制哪些流量能经过防火墙&#xff0c;哪些流量不能通过。本质是包过滤 可以匹配的元素 IP协议版本 源区域和目的区域 源IP地址和目…

【C++那些事儿】C++模板编程入门:构建可重用组件的利器

&#x1f4f7; 江池俊&#xff1a;个人主页 &#x1f525; 个人专栏&#xff1a;✅C那些事儿 ✅Linux技术宝典 &#x1f305; 此去关山万里&#xff0c;定不负云起之望 文章目录 1. 泛型编程2. 函数模板2.1 函数模板概念2.1 函数模板格式2.3 函数模板的原理2.4 函数模板的实…

基于python+vue成都旅游网flask-django-php-nodejs

本篇论文对成都旅游网的需求分析、功能设计、系统设计进行了较为详尽的阐述&#xff0c;并对系统的整体设计进行了阐述&#xff0c;并对各功能的实现和主要功能进行了说明&#xff0c;并附上了相应的操作界面图。 语言&#xff1a;Python 框架&#xff1a;django/flask 软件版本…

select , poll, epoll思维导图

目录 1. 总的框架结构 2. select 3. poll 4. epoll 1. 总的框架结构 2. select

【C语言】自定义类型

1、内存对齐&#xff08;必考&#xff09; 1.1结构体内存对齐 结构体的对齐规则&#xff1a; 1. 第一个成员在与结构体变量偏移量为0的地址处。 2. 其他成员变量要对齐到某个数字&#xff08;对齐数&#xff09;的整数倍的地址处。 对齐数 编译器默认的一个对齐数 与 该成员大…

为什么算法渐进复杂度中对数的底数总为2

在分析各种算法时&#xff0c;经常看到(O(\log_2n))或(O(n\log_2n))这样的渐进复杂度。不知有没有同学困惑过&#xff0c;为什么算法的渐进复杂度中的对数都是以2为底&#xff1f;为什么没有见过(O(n\log_3n))这样的渐进复杂度&#xff1f;本文解释这个问题。 三分式归并排序的…

Obsidian+PicGo+Gitee搭建免费图床

之前使用PicGoGitee配合Typora&#xff0c;后来因为换电脑Typora管理笔记不方便&#xff0c;换到Obsidian笔记&#xff0c;此处记录重新搭建图床的坑与经验。 主要参考# picGogitee搭建Obsidian图床&#xff0c;实现高效写作&#xff01; 1 下载安装PicGo 下载链接https://mo…

ASM四部曲之一:什么是ASM

文章目录 前言什么是.class文件什么是ASM概述作用域模型基于ASM的程序架构 ASM库结构 前言 本文翻译自ASM官方文档。 什么是.class文件 Java字节码文件&#xff08;.class&#xff09;是Java编译器编译Java源文件&#xff08;.java&#xff09;产生的目标文件。它是一种8位字…

【Linux】vim配置及安装方法

注 安装方法在文章最后 配置文件的位置 在目录 /etc/ 下面&#xff0c;有个名为vimrc的文件&#xff0c;这是系统中公共的vim配置文件&#xff0c;对所有用户都有效。而在每个用户的主目录下&#xff0c;都可以自己建立私有的配置文件&#xff0c;命名为“.vimrc”。例如&…

Docker搭建LNMP环境实战(03):VMware安装CentOS

Docker搭建LNMP环境实战&#xff08;03&#xff09;&#xff1a;VMware安装CentOS 1、创建新的虚拟机&#xff0c;选择CentOS7镜像文件&#xff0c;并启动安装 启动VMware&#xff0c;创建新的虚拟机 图1 选择典型安装即可 选用最大最全的CentOS镜像文件&#xff1a;CentOS-7…

遥感原理与应用—绪论

一、关于基本概念与对应的英文 遥感&#xff1a;Remote Sensing 遥测&#xff1a;Telemetry&#xff0c;对被测物体某些运动参数和性质进行远距离测量的技术&#xff0c;分为接触测量与非接触测量&#xff0c;对于RS的概念&#xff0c;遥测探测的目标显得狭隘了一些&#xff…

Machine Learning - Logistic Regression

目录 一、Activation Function Why introduce activation functions? There are several commonly used activation functions: 二、Sigmoid&#xff1a; 三、Logistic Regression Model&#xff1a; 四、Implementation of logistic regression&#xff1a; 五、Decis…