【C语言进阶】数据在内存的存储

news2024/9/22 13:40:08

作者:@匿名者Unit
在这里插入图片描述

目录

  • 一.数据类型分类
      • 1.整形
      • 2.浮点型
      • 3.构造类型
      • 4.指针类型
      • 5.空类型
    • 二.整形的存储
        • 1.原、反、补码
        • 2.大小端存储
      • 三.浮点数的存储

一.数据类型分类

根据不同的数据类型,在内存中的人存储方法也有所差异,所以我们先来介绍一下数据类型的分类。

1.整形

char
unsigned char
signed char
short
unsigned short [int]//int在定义时可写可不写
signed short [int]
int
unsigned int
signed int
long
unsigned long [int]
signed long [int]

2.浮点型

float
double
long double

3.构造类型

/*数组类型*/  int arr[]
/* 结构体类型*/ struct
/* 枚举类型*/ enum
/* 联合类型*/ union

4.指针类型

int *pi;
char *pc;
float* pf;
void* pv;

5.空类型

  • void 表示空类型(无类型)
    通常应用于函数的返回类型、函数的参数、指针类型

二.整形的存储

1.原、反、补码

  1. 整数在内存中是以二进制的形式进行存储的,计算机有三种整数二进制的表示方法:原码、反码、补码

  2. 三种表示方法均有符号位数值位两部分,符号位都是用0表示“正”,用1表示“负。

  3. 正数的原反补码都相同,而负数的原反补需要计算得来。

  4. 原码:
    直接将数值按照正负数的形式翻译成二进制就可以得到原码。

  5. 反码:
    将原码数值位取反得到反码。

  6. 补码:
    反码+1得到补码。

整数在内存中存放的是其补码

2.大小端存储

我们创建两个变量在内存中观察一下,发现a和b变量的存储顺序不太对劲。
在这里插入图片描述
下面我们介绍两种存储方式:

大端存储(大端字节序存储):
把一个数据的低位字节内容存放在高地址,高位字节的内容存放在低地址处。

小端存储(小端字节序存储):
把一个数据的低位字节内容存放在低地址处,高位字节内容存放在高地址处。

了解的大小端存储的区别,我们不免会思考为什么会有不同的存储方式存在呢?在我看来有以下几种原因:

  1. 大小端存储方式存入和取出都比较方便。
  2. 由于寄存器宽度大于一个字节,所以必然会面临多个字节存储顺序的问题。
  3. 可以根据硬件实际情况选择适合的存储方式。
大小端是以字节为单位谈论存储的方式

三.浮点数的存储

在研究浮点数在内存中的存储之前我们先来看一段代码:

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可以表示成下面的形式:

(-1)^S * M * 2^E
(-1)^S表示符号位,当S=0,V为正数;当S=1,V为负数。 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规定: 在不同的机器位数上,浮点数的存储方式也有区别。
在这里插入图片描述

在这里插入图片描述

IEEE 754对有效数字M和指数E,还有一些特别规定:

  1. 因为1<M<2,所以M总是1.xxxxxxxxx,在存储M的值时会省略前缀1,只存xxxxxxxx。
  2. E为一个无符号整数 ,但是E是会有负数的,所以规定存入E值时必须加上中间数,32位机器上是127,64位机器是1023
  3. E不全为0或不全为1时 :指数E的计算值减去127(或1023),得到真实值
  4. E全为0 ,这时,浮点数的指数E等于1-127(或者1-1023) 即为真实值,
    有效数字M不再加上第一位的1,而是还原为0.xxxxxx的小数。这样做是为了表示±0,以及接近于0的很小的数字。
  5. E全为1 ,这时,如果有效数字M全为0,表示±无穷大(正负取决于符号位s);

了解清楚浮点数的存储规则后,我们就可以解释上面的现象是由于整数和浮点数在内存的存储方式不同所造成的。

int main()
{
	int n = 9;
	//00000000000000000000000000001001 - 9的补码
	//0 00000000 00000000000000000001001
	//(-1)^0 * 0.00000000000000000001001 * 2^-126
	//0.000000

	float* pFloat = (float*)&n;

	printf("n的值为:%d\n", n);//9
	printf("*pFloat的值为:%f\n", *pFloat);//0.000000


	*pFloat = 9.0;
	//1001.0
	//(-1)^0 * 1.001 * 2^3
	//s=0
	//e=3
	//m=1.001
	//01000001000100000000000000000000
	//
	printf("num的值为:%d\n", n);//1,091,567,616
	printf("*pFloat的值为:%f\n", *pFloat);//9.0
	return 0;
}

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

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

相关文章

(二)uboot移植--从零开始自制linux掌上电脑(F1C200S)<嵌入式项目>

目录 一、前言 二、F1C200s上电启动顺序 三、前期准备 四、新建用户 五、交叉编译环境配置 六、uboot简介 七、uboot移植 &#x1f34f; uboot下载 &#x1f34f; uboot默认配置 &#x1f34f; uboot图形界面配置 &#x1f34f; uboot编译 &#x1f34f; 烧录bin…

Python-变量和简单数据类型

目录 1. 字符串 1.1. 修改字符串大小写 1.2. 合并字符串 1.3. 制表符与换行符 1.4. 删除空白 2. 数字 2.1. 使用 2.2. 使用str函数避免类型错误 2.3. 注释 2.4. Python之禅 1. 字符串 1.1. 修改字符串大小写 首字母大写&#xff1a;name.title()全部大写&#xf…

基于DDAUNet的CT食管肿瘤分割

摘要 在CT图像中手动或自动描绘食道肿瘤是非常具有挑战性的。这是由于肿瘤与邻近组织的对比度低,食道的解剖结构变化,以及偶尔存在异物(如喂食管)。 本文提出了一种基于卷积神经网络的全自动端到端食管肿瘤,本文所提出的网络称为扩张密集注意力网络,利用每个密集块中的空…

VScode代码片段尝试

最近开始尝试强迫自己使用 VSCode&#xff0c;毕竟 Webstorm 用了很多年了&#xff0c;依赖性比较严重。但是&#xff0c;最近 Webstorm 越来越难搞到免费永久合法使用方式了。 遂转向 VSCode 。 不过 VSCode 需要调教&#xff0c;不像 Webstorm 那么集成度比较高&#xff0c…

CalDAV网络服务器Baikal

什么是 Baikal &#xff1f; Baikal 是一个免费的开源自托管 CalDav 和 CardDav 服务器&#xff0c;适用于想要管理其数据并确保其数据是私有的用户。 Baikal和群晖套件中的 Synology Calendar 是类似的应用&#xff1b; 什么是 CalDav ? CalDav 是一种互联网标准和协议&…

Qt扫盲-QVector理论总结

QVector理论总结一、概述二、使用1. 声明初始化2. 获取元素和链表信息3. 常用操作4. 迭代Vector三、注意一、概述 QVector是Qt的泛型容器类之一。它将每一个元素存储在相邻的内存位置&#xff0c;并提供快速的基于索引的访问。 QList&#xff0c; QLinkedList&#xff0c; QVe…

eurake原理分析以及搭建

消费者随时能够监控到服务的状态 消费者如何获取服务提供者具体的信息&#xff1f; 1&#xff09;服务提供者启动时间eureka注册自己的信息 2&#xff09;eureka保存这些信息 3&#xff09;消费者根据服务名称向eureka拉取提供者的信息 如果有多个服务提供者&#xff0c;消费者…

VS代码生成工具ReSharper v2022.3官宣首发——支持C# 11

实质上&#xff0c;ReSharper特征可用于C#&#xff0c;VB.net&#xff0c;XML&#xff0c;Asp.net&#xff0c;XAML&#xff0c;和构建脚本。 使用ReSharper&#xff0c;你可以进行深度代码分析&#xff0c;智能代码协助&#xff0c;实时错误代码高亮显示&#xff0c;解决方案范…

网络OSI(七层模型)

OSIOSI是一个理论上的网络通信模型&#xff0c;而TCP/IP则是实际运行的网络协议。TCP/IPTCP/IP (传输控制协议/网际协议) 网络通信模型 以及一整个网络传输协议家族应用层应用层协议: FTP TFTP HTTP SNMP SMTP DNS Telnet表示层 数据格式化 代码转换 数据解密/加密会话层 解除或…

低代码如何构建响应式布局前端页面

“你开发的界面为啥在我的屏幕里这么小啊&#xff1f;” “这个界面为啥在我这里会出现横向滚动条啊&#xff1f;” 大家在进行前端界面开发时&#xff0c;有没有遇到这些类似的问题呢&#xff1f;又是如何解决的呢&#xff1f; 页面响应式 在进行项目交付的场景中&#xf…

JavaEE【Spring】:Spring AOP

文章目录一、概念1、定义2、作用二、Spring AOP1、AOP 组成① 切面&#xff08;Aspect&#xff09;② 连接点&#xff08;Join Point&#xff09;③ 切点&#xff08;Pointcut&#xff09;④ 通知&#xff08;Advice&#xff09;2、实现① 添加 AOP 框架支持② 定义切面和切点Ⅰ…

都有哪些好用的设备维护管理软件?这5款值得一试

都有哪些好用的设备维护管理软件&#xff1f; 速速点进来&#xff0c;这些超高性价比的设备维护管理App/软件不容错过&#xff01; 设备是工厂及企业生存的基础&#xff0c;设备的正常运作是保证工厂及企业存活的前提&#xff0c;而要保证设备的正常运作&#xff0c;就必须要…

NLP预训练小结-从词向量到BERT

图像预训练预训练首先是在图像领域广泛应用的。设计网络结构后&#xff0c;处理图像一般是CNN的多层叠加网络结构&#xff0c;先用训练集对网络预先训练&#xff0c;处理新任务时采取相同的网络结构&#xff0c;在比较浅的几层CNN结构&#xff0c;网络参数初始化的时候可以加载…

思科路由器DHCPv6中继服务配置

配置如下&#xff1a; Router>ena Router#conf t Router(config)#host R1 R1(config)#ipv6 unicast-routing R1(config)#service dhcp R1(config)#int g0/1 R1(config-if)#ipv6 add 2001:1::1/64 R1(config-if)#no sh R1(config-if)#exit R1(config)#ipv6 local …

【自学Java】Java三目运算符

Java三目运算符 Java三目运算符教程 在 Java 语言 中&#xff0c;有一种语言可以等价于使用 if…else 进行变量的赋值操作。它就是三目运算符。 Java语言三目运算符详解 语法 Object result condition?value:value2;参数 参数描述condition条件判断符&#xff0c;一般运…

PointNet++详解(二):网络结构解析

如有错误&#xff0c;恳请指出。 在之前对PointNet与PointNet网络进行了介绍&#xff0c;接下来是对其代码的解析。 1. 论文阅读笔记 | 三维目标检测——PointNet 2. 论文阅读笔记 | 三维目标检测——PointNet 参考的github项目为&#xff1a;https://github.com/yanx27/Poi…

window10安装minio

1、首先第一步我们先下载minio 可以从官网上下不同的版本 下载地址&#xff1a;MinIO | Code and downloads to create high performance object storage 2、启动minio 切记不要双击minio&#xff0c; 1、把下载好的minio.exe放到F(我这里放到F里了)&#xff0c;在地址栏里输…

【NI Multisim 14.0编辑环境——项目管理器】

目录 序言 一、项目管理器 ⛄1.“设计工具箱”面板 ⛄2.“SPICE 网表查看器”面板 ⛄3.“LabVIEW 协同仿真终端”面板 序言 NI Multisim最突出的特点之一就是用户界面友好。它可以使电路设计者方便、快捷地使用虚拟元器件和仪器、仪表进行电路设计和仿真。 首先启动NI Mu…

前端调试(常用)

定义调试&#xff1a;代码在某个平台运行&#xff0c;把运行时的状态通过某种方式暴露出来&#xff0c;传递给开发工具做 UI 的展示和交互&#xff0c;辅助开发者排查问题、梳理流程、了解代码运行状态等&#xff0c;这个就是调试。调试就是通过某种信道&#xff08;比如 WebSo…

clip_as_service学习过程(二)——clip主要的功能

参考链接:https://clip-as-service.jina.ai/user-guides/client/#async-encoding 一、encoding()_编码 clip_client提供 encode&#xff08;&#xff09; 函数&#xff0c;允许您以流和同步/异步方式将句子、图像发送到服务器。这里的编码意味着获取文本或图像的固定长度矢量…