【C进阶】数据的存储
文章目录
- :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. ⭐️⭐️总结(思维导图)
最近开学了,没什么时间用来整理博客了,真的是百忙之中抽时间来写博客 😡,后面更新的速度可能会慢点,也有可能开始更行高数、线性代数,毕竟确实是整理在博客上面才会记忆犹新啊😆,看到最后,希望能动动小指头三连😘😘😘
相关文章:

【C进阶】数据的存储
文章目录: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. 数据类型 在了…...

【已解决】异常断电文件损坏clickhouse启动不了:filesystem error Structure needs cleaning
问题 办公室有一台二手服务器,作为平时开发测试使用。由于机器没放在机房,会偶发断电异常断电后,文件系统是有出问题的可能的,尤其是一些不断在读写合并的文件春节后,发现clickhouse启动不了,使用systemct…...

FlinkSQL行级权限解决方案及源码
FlinkSQL的行级权限解决方案及源码,支持面向用户级别的行级数据访问控制,即特定用户只能访问授权过的行,隐藏未授权的行数据。此方案是实时领域Flink的解决方案,类似离线数仓Hive中Ranger Row-level Filter方案。 源码地址: https…...
【基础篇】8 # 递归:如何避免出现堆栈溢出呢?
说明 【数据结构与算法之美】专栏学习笔记 什么是递归? 递归是一种应用非常广泛的算法(或者编程技巧),比如 DFS 深度优先搜索、前中后序二叉树遍历等等都是用到了递归。 方法或函数调用自身的方式称为递归调用,调用…...

基于微信公众号(服务号)实现扫码自动登录系统功能
微信提供了两种方法都可以实现扫描登录。 一种是基于微信公众平台的扫码登录,另一种是基于微信开放平台的扫码登录。 两者的区别: 微信开放平台需要企业认证才能注册(认证费用300元,只需要认证1次,后续不再需要进行缴费年审&#…...

AXI实战(二)-跟着产品手册设计AXI-Lite外设(AXI-Lite转串口实现)
AXI实战(二)-跟着产品手册设计AXI-Lite 设(AXI-Lite转串口实现) 看完在本文后,你将可能拥有: 一个AXI_Lite转串口的从端(Slave)设计使用SV仿真AXI-Lite总线的完整体验实现如何在读通道中实现"等待"小何的AXI实战系列开更了,以下是初定的大纲安排: 欢迎感兴趣的…...

一周搞定模拟电路视频教程,拒绝讲PPT,仿真软件配合教学,真正一周搞定
目录1、灵魂拷问2、懦夫救星3、福利领取2、使用流程1、灵魂拷问 问:模拟电路很难吗? 答:嗯,真的很难!!! 问:模拟电路容易学吗? 答:很难学,建议放…...
高德地图获得角度
//传入两个经纬度点得到车辆角度 设置车辆Marker角度 getAngle(startPoint, endPoint) {if (!(startPoint && endPoint)) {return 0;}let dRotateAngle Math.atan2(Math.abs(startPoint.lng - endPoint.lng),Math.abs(startPoint.lat - endPoint.lat));console.log(&q…...

【C++】-- C++11基础常用知识点(下)
上篇: 【C】-- C11基础常用知识点(上)_川入的博客-CSDN博客 目录 新的类功能 默认成员函数 可变参数模板 可变参数 可变参数模板 empalce lambda表达式 C98中的一个例子 lambda表达式 lambda表达式语法 捕获列表 lambda表达底层 …...

提到数字化,你想到哪些关键词
我们的生活中已经充满了数据,各种岗位例如运营、市场、营销上也都喜欢在职位要求加上一条利用数据、亦或是懂得数据分析。事实上,数据已经成为了构建现代社会的基本生产要素,并且因为不受自然环境的限制,已经成为了人们对未来社会…...
【蓝桥杯集训·每日一题】AcWing 1249. 亲戚
文章目录一、题目1、原题链接2、题目描述二、解题报告1、思路分析2、时间复杂度3、代码详解三、知识风暴并查集一、题目 1、原题链接 1249. 亲戚 2、题目描述 或许你并不知道,你的某个朋友是你的亲戚。 他可能是你的曾祖父的外公的女婿的外甥女的表姐的孙子。 如果…...
iphone所有机型的屏幕尺寸
手机设备型号屏幕尺寸(吋)分辨率点数(pt)屏幕显示模式分辨率像素(px)屏幕比例iPhone SE4.03205682x640113616:9iPhone 6/6s/7/8/SE 24.73756672x750133416:9iPhone 6P/7P/8P5.54147363x1242220816:9iPhone XR/116.14148962x828179219.5:9iPhone X/XS/11P5.83758123x1125243619.…...

Windows10使用-处理IE自动跳转至Edge
文章目录 前言一、调整Edge二、调整Internet选项三、搜索栏的恢复总结前言 微软官方宣布,自2023年2月14日永久停止支持Internet Explorer 11浏览器。后期点击IE 图标将会自动跳转到Edge界面。对于一些网站,可能需要使用IE模式才能正常使用,这时候就需要做相应的调整,才能够…...

linux input子系统,gpio-keys,gpio中断使用
GPIO控制 嵌入式linux下应用编程会经常使用到gpio,GPIO 可以通过 sysfs 方式进行操控,进入到/sys/class/gpio 目录下,如下所示: 可以看到该目录下包含两个文件 export、 unexport 以及 5 个 gpiochipX(X 等于 0、 32、…...

分析称勒索攻击在非洲、中东与中国增长最快
Orange Cyberdefense(OCD)于 2022 年 12 月 1 日发布了最新的网络威胁年度报告。报告中指出,网络勒索仍然是头号威胁 ,也逐渐泛滥到世界各地。 报告中的网络威胁指的是企业网络中的某些资产被包括勒索软件在内的攻击进行勒索&…...
ArcPy批量合并矢量shape文件
当有大量矢量(.shp)格式文件需要合并成一个矢量文件时,可以考虑使用 ArcPy 进行批量合并,代码如下: # coding:utf-8 import os import arcpy from arcpy import envenv.workspace "C:/Users/Desktop/demo"…...
改写有序表的题目核心点
1、核心点 1)分析增加什么数据项可以支持题目 2)有序表一定要保持内部参与排序的key不重复 【补充说明:要存储重复的key值,要么将相同的key压在一起,要么将每个key再封装一层,用内存地址区分】 3&#…...

收藏这几个开源管理系统做项目,领导看了直呼牛X!
项目SCUI Admin 中后台前端解决方案Vue .NetCore 前后端分离的快速发开框架next-admin 适配移动端、pc的后台模板django-vue-admin-pro 快速开发平台Admin.NET 通用管理平台RuoYi 若依权限管理系统Vue3.2 Element-Plus 后台管理框架Pig RABC权限管理系统zheng 分布式敏捷开发…...

【刷题篇】链表(下)
前言🌸各位读者们好,本期我们来填填之前留下的坑,继续来讲解几道和链表相关的OJ题。但和上期单向链表不一样的是,我们今天的题目主要是于环形链表有关,下面让我们一起看看吧。💻本期的题目有:环…...

Shiro
Shiro 1.权限管理概述 2.Shiro权限框架 2.1 概念 2.2 Apache Shiro 与Spring Security区别 3.Shiro认证 3.1 基于ini认证 3.2 自定义Realm --认证 4.Shiro授权 4.1 基于ini授权 4.2 自定义realm – 授权 5.项目集成shiro 认证-授权注意点 5.1 认证…...
【网络】每天掌握一个Linux命令 - iftop
在Linux系统中,iftop是网络管理的得力助手,能实时监控网络流量、连接情况等,帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战
前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...
模型参数、模型存储精度、参数与显存
模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...
MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例
一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)
目录 1.TCP的连接管理机制(1)三次握手①握手过程②对握手过程的理解 (2)四次挥手(3)握手和挥手的触发(4)状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...

深入理解JavaScript设计模式之单例模式
目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式(Singleton Pattern&#…...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文全面剖析RNN核心原理,深入讲解梯度消失/爆炸问题,并通过LSTM/GRU结构实现解决方案,提供时间序列预测和文本生成…...