【C进阶】数据的存储

news/2024/4/25 18:39:08/文章来源:https://blog.csdn.net/m0_74278159/article/details/129094828

文章目录

  • :star:1. 数据类型
  • :star:2. 整形在内存中的存储
    • 2.1 存储规则
    • 2.2 存储模式
    • 2.3 验证大小端模式
  • :star:3. 数据范围
    • 3.1 整形溢出
    • 3.2 数据范围的求解
    • 3.3 练习
  • :star:4. 浮点型在内存中的存储
    • 4.1 浮点数的存储规则
    • 4.2 练习
  • 5. :star::star:总结(思维导图)

⭐️1. 数据类型

在了解数据的是如何存储之前,我们需要先知道C语言有哪些数据类型

😄希望你能看到最后,相信你一定会有收获😄

内置类型
char //字符数据类型
short //短整型
int //整形
long //长整型
long long //更长的整形
float //单精度浮点数
double //双精度浮点数

内置类型分为两大类
整形
char
unsigned char
signed char
short
unsigned short [int]
signed short [int]
int
unsigned int
signed int
long
unsigned long [int]
signed long [int]
浮点型
float
double
long double

构造类型
数组类型
结构体类型struct
枚举类型enum
联合类型union

指针类型
内置类型指针
构造类型指针

空类型
void,空类型不能用来定义变量,通常用来表示函数参数个返回值类型

类型的意义
1.决定了编译器给该类型变量分配的存储空间有多大
2.决定了看待该类型变量中数据的视角

⭐️2. 整形在内存中的存储

2.1 存储规则

整形在内存中的存储均是以补码的形式存在,关于补码的相关概念点我

整形-1在内存中存放的二进制就应该是11111111111111111111111111111111
在这里插入图片描述
内存中的数据以16进制显示,转换成2进制的确是32个1

2.2 存储模式

对于字节数大于1的类型,必然存在着数据在该类型中存放顺序的问题,
数据的存放顺序称为存储模式
数据的存储模式有大端字节序存储小端字节序存储两种模式
存储模式和硬件有关,与编译器无关

  • 大端序(Big-Endian)将数据的低位字节存放在内存的高位地址,高位字节存放在低位地址。这种排列方式与数据用字节表示时的书写顺序一致,符合人类的阅读习惯。
  • 小端序(Little-Endian),将一个多位数的低位放在较小的地址处,高位放在较大的地址处,则称小端序。小端序与人类的阅读习惯相反,但更符合计算机读取内存的方式,因为CPU读取内存中的数据时,是从低地址向高地址方向进行读取的。
    在这里插入图片描述

在我的电脑上是小端存储在这里插入图片描述

2.3 验证大小端模式

想要知道是大端字节序还是小端字节序,我们只需要取一个大于1字节数据类型的数据的低地址位置的数据,观察这个数据是该数字的高位还是低位

int Check_System()
{int a = 1;				//0x00000001char* p = (char*)&a;	//只需要取出一个字节的内容,定义char*return *p;				//*p等于1说明低地址的字节为a的地位,为小端存储
}
int main()
{int ret = Check_System();if (ret == 1){printf("小端存储\n");}else printf("大端存储\n");
}

⭐️3. 数据范围

3.1 整形溢出

每一个整形都有它能表示的最值,当该类型的变量所存储的数据超过了能表示的最值MAX,MIN,存储的数据会转变成另外一个数据,而这个数据一定在该整形所能表示的范围中,这叫做整形溢出

  • 当存储的数据DATA大于该类型MAX,该数据会转换成MIN+(DATA-MAX-1)
    1.在这里插入图片描述
    具体转换过程
    在这里插入图片描述
    2.在这里插入图片描述
    具体转换过程
    在这里插入图片描述

  • 当存储的数据DATA小于该类型MIN,该数据会转换成MAX-(MIN-DATA-1)
    3.在这里插入图片描述
    具体过程
    在这里插入图片描述
    4.在这里插入图片描述
    具体过程
    在这里插入图片描述

3.2 数据范围的求解

知道了当存储的数据超过了该变量类型所能表达的最值后,我们不得不思考,每个类型的最值怎么求?

首先可以参考头文件

#include <limits.h>	//整形类型所能表示的最大小值
#include <float.h>	//浮点型类型所能表示的精度及其范围

在这里插入图片描述
在这里插入图片描述

其次,知道这些范围是怎么来的可以帮助我们更好的理解数据的存储

signed char举例
在这里插入图片描述
signed char补码从8个0到8个1一共有2^8次方中情况,我们为了将每一种二进制序列表示成一个数,就将10000000规定为MIN
我们知道10000001-127的补码,所以我们也可以通过拿-127的补码减一得到-128的补码10000000

3.3 练习

1.
#include <stdio.h>
int main()
{char a= -1;signed char b=-1;unsigned char c=-1;printf("a=%d,b=%d,c=%d",a,b,c);return 0; }

在这里插入图片描述

2.
#include <stdio.h>
int main()
{char a = -128;printf("%u\n",a);return 0; }

在这里插入图片描述

3.
#include <stdio.h>
int main()
{char a = 128;printf("%u\n",a);return 0; }

在这里插入图片描述

//4.
#include <stdio.h>
int main()
{int i = -20;unsigned int j = 10;printf("%d\n", i + j);//按照补码的形式进行运算,最后格式化成为有符号整数
}

在这里插入图片描述

5.
unsigned int i;
for(i = 9; i >= 0; i--) {printf("%u\n",i);
}

在这里插入图片描述

6.
int main()
{char a[1000];int i;for(i=0; i<1000; i++){a[i] = -1-i;}printf("%d",strlen(a));return 0; }

在这里插入图片描述

7.
#include <stdio.h>
unsigned char i = 0;
int main()
{for(i = 0;i<=255;i++){printf("hello world\n");}return 0;}

在这里插入图片描述

⭐️4. 浮点型在内存中的存储

我们先观察一下浮点数5.0在内存中是如何存储的
在这里插入图片描述

2进制表示就是01000000101000000000000000000000
这和5的补码不一样
因此引出一个概念,浮点数的存储规则是什么?

4.1 浮点数的存储规则

根据IEEE(电气电子工程师学会)754标准,一个任意的二进制浮点数V可以表示成下面这种形式

  • -1)^S * m * 2^e
  • (-1)^S表示符号位,当S=0,V为正数;当S=1,V为负数。
  • m表示有效数字,大于等于1,小于2。
  • 2^e表示指数位。

规定32位的浮点数最高位是符号位S,接着的8位是阶码E,最后的23位是尾数M
在这里插入图片描述

规定64位的浮点数最高位是符号位S,接着的11位是阶码E,最后的52位是尾数M
在这里插入图片描述

对于存储浮点数特别规定:
1.因为有效数字m为1.xxxx,所以规定存储时的尾数M是有效数字去掉1后的二进制序列
2.因为指数位e可能为负数,所以规定存储时的阶码E是指数位e-偏移量,对于32位浮点数来说,偏移量是127,对于64位浮点数来说偏移量是1023

对于取出浮点数时特别规定:
1.阶码全为0或1

因为存储浮点数时将有效数字的1去掉了,所以正常情况下取出浮点数的有效数字时需要将去掉的1补回来,取出浮点数的指数位时需要将内存存储的阶码减去偏移量
前面所说的正常情况是值E不为全0或全1
2.阶码E为全0
取出来时阶码E还原成真实指数值e需要在阶码的基础上减去偏移量,如果阶码E全为0,那么指数值为1-127或者1-1023,规定有效数字m不在加上第一位的1,而还原成0.xxxxx
这样做是为了更好的表示±0以及接近于0很小的数字
3.阶码E全为1
阶码全为1,真实指数值就是阶码的值加上偏移量,最后的还原出来的小数就是±无穷大
注:若float型的小数的二进制中指数小于-127,及加上偏移量后阶码仍然为0,这样的小数精度超过了float型的精度,需要用double存储来表示

浮点数5.0f的二进制是101.0
1*2^0+0*2^1+1*2^2+0^2(-1)
5.0f就可以写成(-1)0 x 1.01 x 22
根据IEEE754规则5.0f的二进制序列就是
0 1000001 01000000000000000000000
在这里插入图片描述

4.2 练习

1.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;
}

在这里插入图片描述

2.int main()
{float a = 7.5f;printf("%d\n", a);int b = 2;printf("%f\n", 2);return 0;
}

在这里插入图片描述

特别注意:当char、short、不足int数据进行压栈时,会自动转换为4个字节,float进行压栈时自动转换为double类型,这就是为什么%d可以打印char、short类型的数据而不会影响到后面的参数。看起来%hd和%c是读取两字节和一字节的数,但事实上%hd是在4字节中读取两字节,舍去4字节剩下的部分接着往下读。同理,%c则是在4字节中读取一字节,舍去往下读。这才是为什么short型和char型既可以用%d读,也可以用%hd和%c读的原因。

3.int main()
{long long a = 0x0000004400000033;printf("%c %c\n", a);return 0;
}

在这里插入图片描述

4.int main()
{float a = 7.5f;printf("%lld\n", a);return 0;
}

在这里插入图片描述

5. ⭐️⭐️总结(思维导图)

在这里插入图片描述

最近开学了,没什么时间用来整理博客了,真的是百忙之中抽时间来写博客 😡,后面更新的速度可能会慢点,也有可能开始更行高数、线性代数,毕竟确实是整理在博客上面才会记忆犹新啊😆,看到最后,希望能动动小指头三连😘😘😘

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

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

相关文章

Android - 代码生成远程依赖库(阿里云)

一、注册 没有注册过阿里云且没有实名认证的点这里&#xff1a;阿里云官网 二、查看库 阿里云制品仓库Packages &#xff08;注&#xff1a;如果没有创建企业或个人使用&#xff0c;按照提示&#xff0c;选个人使用&#xff09; 三、选择类型 选择其中一个&#xff08;两…

传统巨头生“变”,中国毫米波雷达市场战火再升级

进入2023年&#xff0c;中国车载毫米波雷达市场战火明显升级。 一方面&#xff0c;愈演愈烈的份额抢夺战不仅仅存在于几大传统巨头之间&#xff0c;也快速转移到与国产供应商之间&#xff1b;随着部分外资巨头的本土化战略深入落地&#xff0c;同时对国产供应商造成了压力。 …

ur3+robotiq ft sensor+robotiq 2f 140配置gazebo仿真环境

ur3robotiq ft sensorrobotiq 2f 140配置gazebo仿真环境 搭建环境&#xff1a; ubuntu: 20.04 ros: Nonetic sensor: robotiq_ft300 gripper: robotiq_2f_140_gripper UR: UR3 通过上一篇博客配置好ur3、力传感器和robotiq夹爪的rviz仿真环境后&#xff0c;现在来配置一下对…

MySQL数据库————MVCC

MySQL的脏读、幻读、不可重复读 脏读 现在有两个事务在操作table表&#xff0c;事务B修改了id2的name字段为李老四&#xff0c;但是没有提交&#xff0c;事务A查询id2的数据&#xff0c;得到name为李老四&#xff1b;事务B发生回滚&#xff0c;id2的数据的name又变回李四&…

性能测试知多少?怎样开展性能测试

看到好多新手&#xff0c;在性能需求模糊的情况下&#xff0c;随便找一个性能测试工具&#xff0c;然后就开始进行性能测试了&#xff0c;在这种情况下得到的性能测试结果很难体现系统真实的能力&#xff0c;或者可能与系统真实的性能相距甚远。 与功能测试相比&#xff0c;性能…

【Spring Boot 原理分析】- 自动配置

【Spring Boot 原理分析】- 自动配置 Condition 注解 Condition 是 Spring 4.0 增加的条件判断功能&#xff0c;通过这个功能可以实现选择的创建 Bean 操作 &#x1f451; 我们在使用 Spring 的时候&#xff0c;只需导入某个依赖的坐标&#xff0c;就可以直接通过 Autwired 注…

堆,堆构建,堆排序,PriorityQueue和TopN问题

零. 前言 堆作为一种重要的数据结构&#xff0c;在面笔试中经常出现&#xff0c;排序问题中&#xff0c;堆排序作为一种重要的排序算法经常被问道&#xff0c;大顶堆小顶堆的应用经常出现&#xff0c;经典的问题TopN问题也是堆的重要应用&#xff0c;因此&#xff0c;了解并掌握…

Mac - Spotlight(聚焦)

文章目录一、Mac 中 Spotlight 的使用1、调用/打开 Spotlight2、执行搜索3、Spotlight 设置二、Mac 上的 Spotlight 开发1、关于 Spotlight2、使用 NSMetadataQuery 搜索示例三、mds 和 fsevents四、命令行访问 Spotlight五、Core Spotlight Framework六、Spotlight 插件相关资…

CSS预处理器sass和less

文章目录CSS预处理器什么是CSS预处理器Sass和LESS背景介绍Sass背景介绍LESS的背景介绍Sass安装Sass下载Ruby安装文件安装Ruby安装Sass编译Sass命令行编译命令行编译配置选项四种编译排版演示nested 编译排版格式expanded 编译排版格式compact 编译排版格式compressed 编译排版格…

登录逻辑漏洞整理集合

目录一、任意用户注册1.未验证邮箱/手机号2、不安全验证邮箱/手机号3.批量注册4.个人信息伪造5.前端验证审核绕过6.用户名覆盖二、任意用户登录1、万能密码2、验证码、密码回显3、登录检测不安全三、任意账号重置1、重置账号名2、验证码3、MVC数据对象自动绑定4、Unicode字符处…

独立产品灵感周刊 DecoHack #048 - 优秀独立开发产品推荐

如果有关注我的 Twitter 的朋友应该看到了&#xff0c;我上周末研究了两天 AI 画图&#xff0c;现在用 Ai 做图太强了&#xff0c;上周又升级 Stable Diffusion 玩了一下&#xff0c;和我去年试的时候相比强大了好多&#xff0c;而且插件LoRA模型玩法都还在快速迭代&#xff0c…

强化学习DQN之俄罗斯方块

强化学习DQN之俄罗斯方块强化学习DQN之俄罗斯方块算法流程文件目录结构模型结构游戏环境训练代码测试代码结果展示强化学习DQN之俄罗斯方块 算法流程 本项目目的是训练一个基于深度强化学习的俄罗斯方块。具体来说&#xff0c;这个代码通过以下步骤实现训练&#xff1a; 首先…

车机开发【Android SystemUI 架构音量控制详解】

SystemUI介绍 SystemUI摘要 在Android系统中SystemUI是以应用的形式运行在Android系统当中&#xff0c;即编译SystemUI模块会生产APK文件&#xff0c;源代码路径在frameworks/base/packages/SystemUI/&#xff0c;安装路径system/priv-app/-SystemUI。 什么是SystemUI 在前…

使用带有 Moveit 的深度相机来避免碰撞

文章目录 什么是深度相机?如何将 Kinect 深度相机添加到您的环境中在 Rviz 中可视化深度相机数据在取放场景中使用深度相机将深度相机与您的 Moveit 设置一起使用有很多优势。机器人可以避免未知环境中的碰撞,甚至可以对周围的变化做出反应。然而,将深度相机连接到您的设置并…

FlinkSQL行级权限解决方案及源码

FlinkSQL的行级权限解决方案及源码&#xff0c;支持面向用户级别的行级数据访问控制&#xff0c;即特定用户只能访问授权过的行&#xff0c;隐藏未授权的行数据。此方案是实时领域Flink的解决方案&#xff0c;类似离线数仓Hive中Ranger Row-level Filter方案。 源码地址: https…

数据分片(mycat)

1. 数据分片概念&#xff1a; 1.1. 分库分表 什么是分库分表&#xff1a; 将存放在一台数据库服务器中的数据&#xff0c;按照特定方式&#xff08;指的是程序开发的算法&#xff09;进行拆分&#xff0c;分散存放到多台数据库服务器中&#xff0c;以达到分散单台服务器负载的…

第51篇-某彩网登录参数分析-webpack【2023-02-21】

声明:该专栏涉及的所有案例均为学习使用,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!如有侵权,请私信联系本人删帖! 文章目录 一、前言二、网站分析一、前言 今天我们看一个webpack的网站 aHR0cHM6Ly8xMGNhaTUwMC5jYy9sb2dpbg==二、网站分析 首先…

网络协议(一)应用层(自定制协议、HTTP协议)

目录 应用层&#xff1a;负责应用程序之间的数据沟通 一、自定制协议&#xff08;私有协议&#xff09; 二、HTTP协议 1&#xff09;、请求行解析&#xff1a;GET /index.html HTTP/1.1 第一部分&#xff1a;请求方法&#xff1a;多种多样&#xff0c;描述不同的请求目的 …

大数据知识图谱项目——基于知识图谱的医疗知识问答系统(详细讲解及源码)

基于知识图谱的医疗知识问答系统 一、项目概述 本项目基于医疗方面知识的问答&#xff0c;通过搭建一个医疗领域知识图谱&#xff0c;并以该知识图谱完成自动问答与分析服务。本项目以neo4j作为存储&#xff0c;基于传统规则的方式完成了知识问答&#xff0c;并最终以关键词执…

Verilog 学习第五节(串口发送部分)

小梅哥串口部分学习part1 串口通信发送原理串口通信发送的Verilog设计与调试串口发送应用之发送数据串口发送应用之采用状态机实现多字节数据发送串口通信发送原理 1&#xff1a;串口通信模块设计的目的是用来发送数据的&#xff0c;因此需要有一个数据输入端口 2&#xff1a;…