数据在内存中的存储方式

🌟🌟作者主页:ephemerals__

🌟🌟所属专栏:C语言

目录

前言 

一、整数的存储

二、大小端字节序及其判断

1.什么是大小端

2.为什么有大小端

3.用c语言编写程序判断大小端

三、浮点数的存储

1.浮点数的存储规则

2.浮点数的存储过程:

3.浮点数的读取过程:

总结


前言 

        我们都知道,在计算机中,数据都是以二进制的形式存储的。但是对于整数和浮点数而言,它们的存储方式却略有不同。今天我们深入探讨以下整数和浮点数在内存中的存储。

一、整数的存储

       整数的二进制表示方法有三种:原码,反码和补码。当表示有符号的整数时,这三种表示方法都有符号位数值位两部分,符号位占一个二进制位(最高位),数值位占其余二进制位,当符号位为0时,表示这是一个正数,为1时表示这是一个负数

这里需要注意以下两点:

1.正整数的源码,反码和补码相同。

2.对于负整数,三者均不相同:

        原码:直接将数值翻译成二进制数。

        反码:符号位不变,数值位按位取反。

        补码:源码+1得到补码。

正数的存储方式:一律以补码的形式存储。

二、大小端字节序及其判断

        首先,我们来运行一段代码:

我们给a赋值0x11223344,但是在内存窗口中这四个字节的内容却是倒着排放的。这是为什么呢?

这就涉及到大小端的问题了。

1.什么是大小端

        对于一个超过一字节的数据,在内存中存储的时候我们就需要考虑到字节排列的顺序问题。我们根据不同的字节存储顺序,将其分为大端字节序和小端字节序。它们的含义是:

大端字节序表示位的字节内容存放在地址处,位字节内容存放在地址处。

小端字节序表示位的字节内容存放在地址处,位字节内容存放在地址处。

我们画图表示以下大小端的含义:

2.为什么有大小端

        那么,为什么会有大小端呢?

        因为在很多编程语言当中,许多数据类型的内存大小是大于一个字节(8bit)的,它们存储在宽度大于一个字节的寄存器当中时,必然存在多个字节安排顺序的问题。因此,大端字节序和小端字节序就出现了。

3.用c语言编写程序判断大小端

        在了解了大小端的概念及成因后,我们就可以由此来写一个程序,判断当前机器是大端还是小端了:

#include <stdio.h>

int main()
{
	int a = 0x11223344;
	char* p = &a;//用char型指针访问int型变量,访问其最低地址的空间
	printf("%x\n", *p);
	return 0;
}

运行结果:

可以看到,程序以十六进制形式打印出了这个数的最低位。由于char型指针访问的是int类型的最低地址空间,这就说明最低地址存放的是低位的字节内容,所以作者的电脑是小端字节序

三、浮点数的存储

        了解了整数的存储之后,我们来探讨一下浮点数的存储。首先我们可以猜一猜以下代码的运行结果:

#include <stdio.h>

int main()
{
	int n = 9;
	float* p = (float*)&n;
	printf("n的值为:%d\n", n);
	printf("*p的值为:%f\n", *p);
	*p = 9.0f;
	printf("n的值为:%d\n", n);
	printf("*p的值为:%f\n", *p);
	return 0;
}

结果如下:

看到结果,想必你会大吃一惊吧!为什么同一个数,以不同的类型输出会有这么大的差异?这就关乎浮点数在内存中的存储了。

1.浮点数的存储规则

根据国际IEEE754标准,任意一个二进制的浮点数都可以表示成如下形式:

V=\left ( -1 \right )^{S}\times M\times 2^{E}

其中,\left ( -1 \right )^{S}表示符号位,S为0时,表示V是一个正数;S为1时,表示V是一个负数。

           M表示V的有效数字。1\leqslant M< 2

           2^{E}表示指数位。

举个例子,对于浮点数5.0,它的二进制形式是101.0,写成科学计数法就是1.01\times 2^{2}

这样,根据刚才的格式,S=0,M=1.01,E=2。

我们可以发现:对于一个浮点数,只要知道了S,M,E这三个值,就能得出这个浮点数的值。在计算机中,浮点数也是将这三个数存储到内存中,使用时根据规则就能够得到该值。这三个数的存储规则如下:

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

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

2.浮点数的存储过程:

1.对于有效数字M,由于1\leqslant M< 2,就是1.xxxxxx的形式,那么这个个位数“1”就可以不用存储,只存储小数部分,这样就可以多存储一位有效数字。

2.对于指数E,首先这里的E一定是一个无符号整数,但是科学计数法的指数是可以出现负数的,所以,IEEE754规定:存入E时,要给它加上一个中间数再存储。对于8位的E,中间数是127;对于11位的E,这个中间数是1023。

3.浮点数的读取过程:

浮点数的读取过程分三种情况:

1.E的各位不全为0或者不全为1:此时,将E的值取出并减去127(或1023),得到真实值,然后将有效数字M加上1。

2.E全为0:此时,E的真实值变成1-127(或1-1023),并且M不再加1,这用于表示±0或者极小的数字。

3.E全为1:此时,如果有效数字M全为0,这个数就表示正负无穷大(符号由S决定)。

了解了浮点数的存储规则,存储过程和读取过程之后,之前代码的运行结果就能够说明白了。

总结

        这篇文章我们探讨了整数的存储、大小端的概念和判断方式、浮点型数据的存储规则,存储过程和读取过程,进一步了解了计算机底层数据的存储模式。之后博主会继续跟大家分享c语言相关内容,感谢大家的支持❤❤❤

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

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

相关文章

第7章:Electron文件系统操作(2)

7.2 文件对话框 Electron 提供了 dialog 模块用于显示文件打开和保存对话框。 7.2.1 显示文件打开对话框 主进程代码&#xff1a; const { app, BrowserWindow, ipcMain, dialog } require(electron); const path require(path);let mainWindow;const createMainWindow …

【Unity学习笔记】A*寻路算法

文章目录 图寻路算法BFS广度优先算法DFS深度优先贪心算法 引入权重Dijkstra算法 A*算法C#实现步骤 Unity中的A*算法A*优化建议 图 图的知识盘点 pathfinding 作为一名计算机专业的学生&#xff0c;对于图这种数据结构也是烂熟于心了。图是一种包含了多个结点的数据结构&…

巴图自动化Modbus协议转Profinet协议网关模块连智能仪表与PLC通讯

一、现场要求:PLC作为控制器&#xff0c;仪表设备作为执行设备。执行设备可以实时响应PLC传送的指令&#xff0c;并将数据反馈给PLC&#xff0c;从而实现PLC对仪表设备的控制和监控&#xff0c;实现对生产过程的精确控制。 二、解决方案:通过巴图自动化Modbus协议转Profinet协议…

大模型面试题目

1.为什么需要做位置编码 位置编码&#xff08;Positional Encoding&#xff09;在变换器&#xff08;Transformer&#xff09;模型中非常重要&#xff0c;因为变换器架构本身没有内置的顺序信息。变换器使用的是自注意力机制&#xff0c;它能够捕捉输入序列中所有词之间的相关性…

Vscode 保存代码,代码自动格式化

我这里使用的插件是Prettier-Code formatter&#xff1a;自动缩进整理代码的格式&#xff0c;使用方法如下&#xff1a; 先在vscode商店找到插件并安装&#xff1a;安装插件之后&#xff0c;随便找到一个项目文件&#xff0c;右键选择格式化文档&#xff1a;选中我们安装的插件…

LVS-负载均衡

目录 一、概念 二、LVS工作原理 1. ipvs/ipvsadm 2.名词&#xff1a; 三、常用命令 四、工作模式 1.NAT地址转换模式 &#xff08;1&#xff09;工作流程 &#xff08;2&#xff09;特点 &#xff08;3&#xff09;实验过程 a.环境准备&#xff1a; b.修改测试机的…

Wing FTP Server

文章目录 1.Wing FTP Server简介1.1主要特点1.2使用教程 2.高级用法2.1Lua脚本,案例1 1.Wing FTP Server简介 Wing FTP Server&#xff0c;是一个专业的跨平台FTP服务器端&#xff0c;它拥有不错的速度、可靠性和一个友好的配置界面。它除了能提供FTP的基本服务功能以外&#…

android应用的持续构建CI(一)-- 总体设计

一、背景 接下里我希望通过一系列的文章&#xff0c;把android应用的构建梳理一遍&#xff0c;从总体设计到逐个环节的实现。 总体设计jenkins集成手动签名依赖环境应用管理 二、构建流程图 三、技术组件 jenkinsjdkgradle360加固 既然是android应用的持续构建&#xff0c…

科普文:Linux服务器性能调优之CPU调度策略和可调参数

概叙 进程 进程是操作系统虚拟出来的概念&#xff0c;用来组织计算机中的任务。计算机的核心是CPU&#xff0c;它承担了所有的计算任务&#xff1b;而操作系统是计算机的管理者&#xff0c;它负责任务的调度、资源的分配和管理&#xff0c;统领整个计算机硬件&#xff1b;应用…

5百多本分章节古籍内容大全ACCESS\EXCEL数据库

很多明清小说现在越来越不容易查看其内容&#xff0c;虽然之前搞到过一份《3万8千多古代文学大全ACCESS数据库》&#xff0c;但简体中文总让我感觉有删减、非原版的印象&#xff0c;今天正好遇到一个好的古籍网站&#xff0c;繁体字繁体文&#xff0c;感觉非常不错&#xff0c;…

微信小程序遮罩层显示

效果展示&#xff1a; wxml页面&#xff1a; <view classmodal-mask wx:if{{showModal}}><view class"modal-container"><view classmodal-content></view><view classmodal-footer bindtap"closeImage">//这个/images/ind…

电脑录音怎么录?简单四个方法轻松搞定!

在电脑上录制音频是一项非常实用的技能&#xff0c;适合多种场合的需求。例如&#xff0c;你可能需要录制自己的声音&#xff0c;用于录音广播、演示或视频制作&#xff1b;也可能需要录制电脑中的声音&#xff0c;如音乐、游戏音效或在线直播&#xff1b;或者需要捕捉浏览器中…

快排的实现

引言 作为c语言库函数的一种&#xff0c;快排在排序中的地位毋庸置疑. 而更加具体的实现如图&#xff1a; 快排的实现&#xff08;递归实现&#xff09; 原理 单趟:先假定第一个数设为key,如果左边指针的值比key大&#xff0c;且右边指针的值比key小&#xff0c;则将其交换.…

亚马逊云服务器的价格真的那么贵吗?一年要花多少钱?

亚马逊Web服务&#xff08;AWS&#xff09;作为全球领先的云计算平台&#xff0c;其定价策略常常引起用户的关注。很多人可能会问&#xff1a;"AWS真的那么贵吗&#xff1f;"实际上&#xff0c;这个问题的答案并不是简单的"是"或"否"&#xff0c…

JavaScript技术的小饰品销售管理系统-计算机毕业设计源码21597

摘 要 在当今的数字化时代&#xff0c;电子商务已经成为了商业领域中不可或缺的一部分。随着消费者对于购物体验的要求越来越高&#xff0c;一个高效、便捷、用户友好的小饰品销售管理系统显得尤为重要。 本系统旨在利用 JavaScript 技术&#xff0c;设计并实现一个功能强大的小…

黑马点评DAY5|商户查询缓存

商户查询缓存 缓存的定义 缓存就是数据交换的缓冲区&#xff08;Cache&#xff09;&#xff0c;是存储数据的临时地方&#xff0c;一般读写性能较高。 比如计算机的CPU计算速度非常快&#xff0c;但是需要先从内存中读取数据再放入CPU的寄存器中进行运算&#xff0c;这样会限…

ForkJoin框架与工作窃取算法详解

文章目录 一、ForkJoin框架概述1_核心概念2_主要类和方法1_ForkJoinPool2_ForkJoinTask 二、启用异步模式与否的区别三、ForkJoinPool的三种任务提交方式四、执行逻辑及使用示例1_示例&#xff1a;并行计算数组元素和2_forkJoinPool.submit3_ForkJoinTask<?>中任务的执行…

软件研发标准化流程文件

为了规范化系统开发流程&#xff0c;我们精心制定了一套详尽的规范文档。该文档旨在通过标准化、系统化的方法来显著提升开发效率与项目质量。流程始于明确需求阶段&#xff0c;通过深入细致的设计规划来确保解决方案既可行又具有前瞻性。随后&#xff0c;我们进入高效的编码实…

ClickHouse概述

ClickHouse概述 文章目录 ClickHouse概述ClickHouse是什么ClickHouse快的理由什么是OLAPClickHouse的特点列式存储DBMS 的功能多样化引擎高吞吐写入能力数据分区与线程级并行 ClickHouse的应用合适场景不适合场景 ClickHouse是什么 ClickHouse 是俄罗斯的 Yandex 于 2016 年开…

Appium自动化测试框架3

滑动与拖拽 swipe 滑动时间的长短会影响最后的结果的 是有一定误差的 from appium import webdriver import time # 启动一个字典 包装相应的启动参数 desired_caps dict() # 平台的名字&#xff0c;安卓还是IOS 大小写无所谓 desired_caps[platformName] Android # 平台的…