数据在内存中的存储方式

news/2024/9/18 17:12:29/ 标签: c语言, 笔记, 开发语言

前言:已经好久没更新了,开学之后学习编程的时间少了很多。因此,已经好几个礼拜都没有写文章了。

在讲解操作符的时候,我们就已经学习过了整数在内存中的存储方式。若有不懂的伙伴可以前往操作符详解进行学习。今天我们主要来学习浮点数在内存中的存储方式

首先我们通过几个例子来回顾一下整数在内存中的存储方式。

#include <stdio.h>
int main()
{char a = -1;//10000000000000000000000000000001  ---原码//11111111111111111111111111111110  ---反码//11111111111111111111111111111111  ---补码// 发生截断//a ---11111111signed char b = -1;//11111111111111111111111111111111  ---补码// 发生截断//b ---11111111unsigned char c = -1;//发生截断//c ---11111111// 发生整型提升//a ---11111111111111111111111111111111---补码//10000000000000000000000000000000//10000000000000000000000000000001 ----原码//发生整型提升//c ---00000000000000000000000011111111//255printf("a=%d,b=%d,c=%d", a, b, c);//a=-1,b=-1,c=255return 0;
}
#include <stdio.h>
int main()
{char a = -128;//10000000000000000000000010000000 ---原码//11111111111111111111111101111111 ---反码//11111111111111111111111110000000 ---补码// 发生截断//a ---10000000// 整型提升// %u是以无符号的整型打印//11111111111111111111111110000000printf("%u\n", a); //4, 294, 967, 168return 0;
}
#include <stdio.h>
#include <string.h>
int main()
{//字符数组char a[1000] = { 0 };int i;for (i = 0; i < 1000; i++){a[i] = -1 - i;}//strlen是一个求取字符串长度的库函数,求取的是\0之前的字符个数//\0的ASCII码值是0//signed char的取值范围是-128~127printf("%d", strlen(a));//255return 0;
}

浮点数类型包括float,double,long double

看下面的一道题

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

输出的结果是什么呢?相必很多人都会答错吧。

这道题暂且放下,等我们学习完浮点数的存储之后,再来解答这道题。

根据国际标准IEEE(电气和电子工程协会)754,任意一个二进制浮点数V可表示成下列形式:V=(-1)^S*M*2^E

S为0时,V为正数;S为1时,V为负数
M表示有效数字,大于等于1,小于2的
2^E是指数位

例如5.0的二进制是101.0,相当于V=(-1)^0*1.01*2^2,那么S=0,M=1.01,E=2

-5.0的二进制是-101.0,相当于V=(-1)^1*1.01*2^2,那么S=1,M=1.01,E=2

IEEE754规定:

对于32位的浮点数最高的一位存储S,接下来的8位存储E,剩下的23位存储有效数字M

对于64位浮点数最高的一位存储S,接下来的11位存储E,剩下的52位存储有效数字M

在这里插入图片描述


在这里插入图片描述

. 浮点数存的过程

IEEE754对于指数E和M还有一些特别的规定。

前面说过,1<=M<2,也就是说M是可以写成1.xxxxxx的形式,其中xxxxxx表示小数部分。IEEE754规定,在计算机内存中保存M时,默认这个数的第一位总是1,因此可以被舍去只保存后面的小数部分。比如保存1.01的时候,只保存01,等到读取的时候,再把第一位的1加上去。这样做的目的是节省1位有效数字,提高了数据保存的精确度

至于指数E则更加的复杂。E是一个无符号的整数(unsigned int)。这意味着,如果E为8位,它的取值范围是0~255,如果E为11位,它的取值范围是0~2047。但是在科学计数法中,E是可以出现负数的。所以IEEE754规定,存入内存中E的真实值必须再加上一个中间数,对于8位的E,这个中间数是127;对于11位的E,这个中间数是1023

. 浮点数取的过程

指数E从内存中取出可分为3种情况:

指数E不全为0或不全为1

指数E的计算值减去127(或1023),得到真实值,再将有效数字M前加上第一位的1

比如0.5的二进制是0.1V=(-1)^0*1.0*2^-1S=0,M=1.0,E=-1E存入内存的值是-1+127=126126的二进制是01111110

0  01111110  00000000000000000000000
|       |                 |
|       |                 |
|       |                 |
S       E                 M

指数E全为0

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

0 00000000 00100000000000000000000

指数E全为1

有效数字M全为0,则表示正负无穷大(正负取决于符号位S)

0  11111111  00000000000000000000000

浮点数的存储就说完了。接下来让我们回到最初开始的问题。

#include <stdio.h>
int main()
{//9是一个整型,在内存中的存储是以二进制的形式存储的//0 00000000 00000000000000000001001int n = 9;//pFloat是一个浮点型的指针,指向的对象是一个浮点型数据//S = 0,E = 00000000,M = 00000000000000000001001float* pFloat = (float*)&n;printf("n的值为:%d\n", n);//9//32位环境下//E全为0,E的真实值就等于1-127=-126//M=0.00000000000000000001001//V=(-1)^0*1.001*2^(-146),很显然这是一个接近于0的正数printf("*pFloat的值为:%f\n", *pFloat);//0.000000//将n的值改为9.0*pFloat = 9.0;//1001.0//S=0,M=1.0010,E=3//V=(-1)^0*1.001*2^3,存入内存中E的值是3+127=130// 130的二进制位是10000010//01000001000100000000000000000000printf("num的值为:%d\n", n);//1,091,567,616printf("*pFloat的值为:%f\n", *pFloat);//9.000000return 0;
}

http://www.ppmy.cn/news/1526752.html

相关文章

java.人机猜拳游戏

人机猜拳&#xff0c;这里我们定义输入0是剪刀&#xff0c;1是石头&#xff0c;2是布。电脑的数字为随机产生&#xff0c;可以用Random。 采用三局制。三局中每一小局中都有输出显示小局的获胜方三局比赛结束后&#xff0c;若电脑获胜次数等于玩家&#xff0c;则输出&#xff1…

使用ENVI之辐射定标

将下载好的遥感影像导入遥感影像处理软件ENVI 5.6中 使用ENVI 5.6的Toolbox中的Radiometric Calibration工具 跳出的Date Input File界面中选中要进行辐射定标的文件选中 再在跳出的Radiometric Calibration界面中将Output Interleave改为BIL再点击Apply FLAASH Settings Soale…

PostgreSQL的表压缩

PostgreSQL的表压缩 PostgreSQL提供了在表或列级别进行数据压缩的功能&#xff0c;以帮助减少存储空间和提高I/O性能。具体来说&#xff0c;PostgreSQL 14及以后的版本引入了对表级和列级压缩的支持。 表压缩 The COMPRESSION clause sets the compression method for the c…

NASA:ATLAS/ICESat-2 L2 A标准化相对反向散射剖面V006

ATLAS/ICESat-2 L2A Normalized Relative Backscatter Profiles V006 ATLAS/ICESat-2 L2 A标准化相对反向散射剖面V006 简介 ATL04 包含大气层的沿轨迹归一化相对后向散射剖面图。 该产品包括完整的 532 nm&#xff08;14 公里&#xff09;未校准衰减后向散射剖面图&#xf…

mysql workbench 如何访问远程数据库

要使用 MySQL Workbench 访问远程数据库&#xff0c;可以按照以下步骤操作&#xff1a; 步骤 1&#xff1a;获取远程数据库的连接信息 首先&#xff0c;确保你有远程数据库的以下信息&#xff1a; 主机名&#xff08;Host&#xff09;&#xff1a;通常是服务器的 IP 地址或域…

mysql把某一个字段的值中的aa,替换成bb

UPDATE my_table SET my_column REPLACE(my_column, aa, bb); 例 假设my_table表在替换前的数据如下&#xff1a; idmy_column1hello aa2world aa aa3no aa here 执行上述UPDATE语句后&#xff0c;my_table表的数据将变为&#xff1a; idmy_column1hello bb2world bb b…

vulnhub靶机:Holynix: v1

下载 下载地址&#xff1a;https://www.vulnhub.com/entry/holynix-v1,20/ 打开虚拟机 选择下载解压之后的文件打开 新添加一张 NAT 网卡&#xff0c;mac 地址修改如下 00:0c:29:bc:05:de 给原来的桥接网卡&#xff0c;随机生成一个 mac 地址 然后重启虚拟机 信息收集 主…

[网络]https的概念及加密过程

文章目录 一. HTTPS二. https加密过程 一. HTTPS https本质上就是http的基础上增加了一个加密层, 抛开加密之后, 剩下的就是个http是一样的 s > SSL HTTPS HTTP SSL 这个过程, 涉及到密码学的几个核心概念 明文 要传输的真正意思是啥 2)密文 加密之后得到的数据 这个密文…

10.索引下推

10.索引下推 10.1.什么是索引下推&#xff1f; &#xff08;1&#xff09;索引下推 (Index Condition Pushdown, ICP) 是 MySQL 5.6 中新特性&#xff0c;是一种在存储引擎层使用索引过滤数据的一种优化方式。 &#xff08;2&#xff09;如果没有 ICP&#xff0c;存储引擎会遍…

设计模式---中介者模式

设计模式---中介者模式 定义与设计思路中介者模式的引入&#xff1a;机场控制塔中介者模式的设计框架 定义与设计思路 定义&#xff1a;用一个中介对象来封装一系列对象交互。中介者使各对象不需要相互引用&#xff0c;从而使其耦合松散&#xff0c;而且可以独立地改变它们之间…

CISP-PTE CMS sqlgun靶场

sql靶场有个搜索框先点一下go&#xff0c;有回显说明存在漏洞 有个xss 然后在这里尝试sql注入 输入 -1 union select 1,2,3# 有回显可以查看数据库 然后查询数据库&#xff0c;用户 查询数据库的表名 查询它的数据这里admin用户的密码是md5加密 去解密看看 然后扫描ip目录发…

【ShuQiHere】 进位回补与溢出问题全解:二补码与一补码的进阶指南

【ShuQiHere】 在现代计算机系统中&#xff0c;数值运算的准确性和效率至关重要。无论是整数的加法还是减法&#xff0c;在处理负数、符号位和进位问题时&#xff0c;都可能遇到 进位回补&#xff08;End-Around Carry&#xff09; 和 溢出&#xff08;Overflow&#xff09; 等…

python Open3D 验证安装崩溃

环境 Win11 python 3.11.9 numpy 2.1.1 问题 根据官方指南安装了python的open3d库&#xff0c;但是在验证安装的时候&#xff0c;总是崩溃&#xff0c;详细内容参考GitHub Issue # Python API python -c "import open3d as o3d; \mesh o3d.geometry.TriangleMesh.cre…

Netty笔记06-组件ByteBuf

文章目录 概述ByteBuf 的特点ByteBuf的组成ByteBuf 的生命周期 ByteBuf 相关api1. ByteBuf 的创建2. 直接内存 vs 堆内存3. 池化 vs 非池化4. ByteBuf写入代码示例 5. ByteBuffer扩容6. ByteBuf 读取7. retain() & release()TailContext 释放未处理消息逻辑HeadContext 8. …

基于kolla-ansible在openEuler 22.03 SP4上部署OpenStack-2023.2

测试环境 openEuler-22.03-LTS-SP4-x86_64-dvd.iso Virtual Box&#xff0c;4 vCPU, 8G RAM, 50 vDisk。安装时删除/home&#xff0c;SWAP分区&#xff0c;全部空间给/目录。 目标是部署OpenStack All-In-One模式&#xff0c;控制节点计算节点存储节点在一台机器实现。 系统配…

有哪些方法可以减少脏页标记技术中的磁盘 I/O 操作?

减少脏页标记技术中磁盘 I/O 操作的方法 一、引言 在数据库系统中,脏页标记技术用于跟踪被修改但尚未写入磁盘的数据页。然而,频繁的磁盘 I/O 操作会严重影响数据库的性能。因此,寻找有效的方法来减少脏页标记技术中的磁盘 I/O 操作至关重要。 二、优化脏页标记策略 (一…

Axure设计之全屏与退出全屏交互实现

在Axure RP中&#xff0c;设计全屏与退出全屏的交互功能可以极大地提升用户体验&#xff0c;尤其是在展示产品原型或进行演示时。本文将详细介绍如何在Axure RP中通过结合JavaScript代码实现全屏与退出全屏的交互效果。 ​ Axure原型设计web端交互元件库&#xff1a;https://…

【系统架构设计师】建造者模式(Builder Pattern)

建造者模式详解 1. 什么是建造者模式? 建造者模式(Builder Pattern)是一种创建型设计模式,它允许通过分步构造复杂对象,而无需知道对象内部的具体实现细节。换句话说,建造者模式将对象的创建过程抽象出来,分离对象的构建和表示,使得同样的构建过程可以创建不同类型的…

什么是大模型的推理?

目录 1. 大模型的推理过程原理 2. 简单生动的例子说明大模型推理 3. 学习大模型推理的最好办法 1. 大模型的推理过程原理 大模型的推理过程主要是基于海量数据的训练&#xff0c;来生成或预测出最可能的输出。以语言模型为例&#xff0c;它是通过输入一段文本&#xff08;称…

请求响应-05.请求-日期参数JSON参数

一.日期参数 当浏览器发起的请求参数类型是日期参数时&#xff0c;我们通常使用LocalDateTime对象来接收&#xff0c;前面使用DateTimeFormat注解来完成日期的格式转换&#xff08;日期时间格式有多种&#xff0c;需要哪种就设置为哪种&#xff1a;如yyyy-MM-dd HH:mm:ss&…