首页 > 系统相关 >整数和浮点数在内存中的存储

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

时间:2024-03-22 16:29:54浏览次数:45  
标签:存储 二进制 浮点数 有效数字 内存 127

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

整数在内存中的存储

1.整数是以二进制的形式存储的,一个二进制位会占据一个比特位的空间。
例如:

#include<stdio.h>
int main()
{
	int a = 10;//十进制的形式
	//1010  二进制形式
	//一个整型是四个字节,32个比特位,1010只有4个二进制位,所以我们要补0,向前补0,补齐32位
	//00000000 00000000 00000000 00001010
	//00000000000000000000000000001010  是以这样的形式在内存中存储的
	return 0;
}

在这里插入图片描述

浮点数在内存中的存储

为了了解浮点数是如何在内存中存储的,我们可以先做一道题。

int main()
{
	int n = 9;
	float* pf = (float*)&n;
	printf("%d\n", n);//?
	printf("%f\n", n);//?

	*pf = 9.0;
	printf("%d\n", n);//?
	printf("%f\n", n);//?
	return 0;
}

1.浮点数的存储
根据国际标准IEEE(电⽓和电⼦⼯程协会) 754,任意⼀个⼆进制浮点数V可以表⽰成下⾯的形式:
V = (-1)^ s * M * 2^E
(1)(-1)^s代表的是数的正负,如果S为0,则是正数,如果为1,则是负数。
(2)M是有效数字,小于2,大于等于1。
(3)E是指数位
举例说明:
5.5的二进制就是101.1
个位的5的二进制是101,小数点后面的5的二进制是1(1*2^(-1))
因此,5.5的二进制就是101.1,就相当于(-1)^0* 1.011*2^3,所以,S = 0,M = 1.011,E = 3

2.浮点数存储
IEEE 754规定:
对于32位的浮点数,最⾼的1位存储符号位S,接着的8位存储指数E,剩下的23位存储有效数字M
在这里插入图片描述

对于64位的浮点数,最⾼的1位存储符号位S,接着的11位存储指数E,剩下的52位存储有效数字M
在这里插入图片描述
在这里插入图片描述

2.浮点数存的过程
(1)在存储的过程中,M是需要写成1.XXXXXX的形式,但是在存储的过程中,我们只需要将小数点后面的小数位进行存储,不用存储小数点前面的1,在取数据的时候,再返回1就行了,这样可以提高数据存储的精度,32位上我们就可以存储24个有效数字了。
(2)在存储的过程中,E是一个无符号整型,8个bit位的话,大小就在0~~255之间,11个bit位的话,大小就在0~2047,但是科学计数法中,指数可以是负数的,所以,在8位时,指数是先+127后,再存储到内存中的,在取出的时候,会先将指数-127,在进行计算的。在11位时,指数是先加上中间数1023后,再存储到内存中的.
举例说明:
5.5的二进制就是101.1
个位的5的二进制是101,小数点后面的5的二进制是1(1*2^(-1))
因此,5.5的二进制就是101.1,就相当于(-1)^0* 1.011*2^3,所以,S = 0,M = 1.011,E = 3
那么在内存中存储的就是

//0 10000010 01100000000000000000000
//S  E                   M
//注意:E = 3 + 127后,再进行存储。

3.浮点数取出
指数E从内存中取出可以分为三种情况。
(1)E不为全0或全1的情况
E-127得到真实值,再在有小数M的前面加上1.
举例说明:
0.5 二进制就是0.1 = 1.0
相当于(-1)^0* M *2^(-1)
s == 0;
M == 0;
E == -1 +127 = 126;

//0 01111110 0000000000000000000000

(2)E为全0的情况
这时,浮点数的指数的真实值就是1-127,有效数字M就不会在前面补1,而是还原为0.XXXX小数,这样的数字表示无限接近于±0的数。

0 00000000 0010000000000000000000000

(3)E为全1的情况
这时,如果有效数字为0的话,这将会时一个±无穷大的数字。

0 11111111 0010000000000000000000000

标签:存储,二进制,浮点数,有效数字,内存,127
From: https://blog.csdn.net/zxybf_/article/details/136942582

相关文章

  • pyhon字典值存储列表
    示例构建了一些域名作为字典键值对,将顶级域名下不同的二级域名添加到字典值存储列表importredata=["x.douyinvod.com","x.amemv.com","x.snssdk.com","x.douyincdn.com","x.douyinliving.com","x.huoshanlive.com"......
  • 每日面经分享03.22(垃圾回收、内存溢出)
    1.什么是垃圾回收机制a.垃圾回收是一种自动内存管理机制,用于在程序运行时自动释放不再使用的内存空间。b.作用减少内存泄漏和提高程序的性能。2.Python中垃圾回收机制方法a.gc模块:Python提供了gc(GarbageCollector)模块,用于控制和调整垃圾回收机制的行为。通过该模......
  • JavaScript 本地存储
    1.前言由来:localStorage和sessionStorage是HTML5标准中新加入的技术,用于保存整个网站的数据两者区别:localStorage的生命周期是永久的,除非手动删除,而sessionStorage仅在当前会话下有效(即使是同个域名下的网页也无法访问当前会话下创建的键值对,关闭页面或浏览器后被清除,刷新当......
  • 【测试开发学习历程】MySQL增删改操作 + 备份与还原 + 索引、视图、存储过程
    前言:SQL内容的连载,到这里就是最后一期啦!如果有小伙伴要其他内容的话,我会追加内容的。(前提是我有学过,或者能学会)接下来,我们就要开始python内容的学习了~~ 目录1 MySQL增删改操作1.1数据添加操作1.1.1插入完整的行1.1.2插入多行1.2数据更新操作1.3数据删除操......
  • C语言内存函数之 memcpy和memmove函数
    memcpy函数的记忆方法:mem表示内存类函数,属于头文件string.h里面的函数。cpy是copy的缩写,表示对内存数据进行拷贝。memcpy函数的输入值和返回值:void* my_memcpy(void*brr,void*arr,size_tv) memcpy的输入值分别是被拷贝数据的brr的无类型数组的首地址,然后是拷贝给别人的无......
  • Java内存马1-传统web内存马
    1、前置知识(1)TomcatTomcat是一个开源的、轻量级的、用于JavaServlet和JavaServerPages(JSP)的Web应用程序服务器。它是Apache软件基金会的一个项目,也是最流行的Servlet容器之一,适用于开发和部署各种类型的JavaWeb应用程序。Tomcat负责管理Servlet的生命周期,包括加载、初始化......
  • 【ai技术】(3):树莓派4,成功安装ollama软件,内存4G,推荐使用命令行界面安装,使用raspi-config
    1,关于raspberrypi4项目https://www.bilibili.com/video/BV1K2421P71h/【ai技术】(3):树莓派4,成功安装ollama软件,内存4G,安装命令行版本,使用raspi-config配置wifi,速度9t/s2,下载raspberrypi镜像项目地址:https://www.raspberrypi.com/software/operating-systems/#r......
  • cuda 内存模型
    cuda内存模型其实概括来说就是下面两张图双箭头代表可读可写,单箭头代表只读1.localmemory#include<iostream>#include"cuda_runtime.h"#include"device_launch_parameters.h"#defineBLOCK_SIZE256__global__voidtest_kernal(){ intarray[3]; floatvalu......
  • 存储过程的优点和缺点
    存储过程的优点和缺点 优点1.运行速度:对于很简单的sql,存储过程没有什么优势。对于复杂的业务逻辑,因为在存储过程创建的时候,数据库已经对其进行了一次解析和优化。存储过程一旦执行,在内存中就会保留一份这个存储过程,这样下次再执行同样的存储过程时,可以从内存中直接调......
  • UEditor-结合XML文件上传导致的存储型XSS
    1、在某学校的考试系统的事故案例->添加新文章2、由于该编辑器为UEditor,并根据版本信息可联系到历史爆出过漏洞,在.NET开发的版本可通过木马文件上传进行getshell;但又由于此处为php语言开发,只能上传xml文件,于是思路转变成xml文件上传+XSS组合拳的方式进行测试。3、先构造一个te......