数据在内存的存储
数据类型介绍
前面我们已经学习了基本的内置类型:
char //字符数据类型 1字节 打印%cshort //短整型 2字节 打印%hdint //整形 4字节 打印%dlong =long int //长整型 4/8字节 打印%ldlong long =long long int //更长的整形 8字节 打印%lldfloat //单精度浮点数 4字节 打印%fdouble //双精度浮点数 8字节 打印%lfsizeof(long)>=sizeof(int)
整形打印无符号数将格式中的d换成u就行
类型的基本归类
整形家族:charunsigned charsigned char
shortunsigned short [int]signed short [int]intunsigned intsigned intlongunsigned long [int]signed long [int]long long
浮点数家族:floatdoublelong double
构造类型:> 数组类型
> 结构体类型 struct> 枚举类型 enum> 联合类型 union
指针类型int *pi;char *pc;float* pf;void* pv;结构体指针等等
整形在内存中的存储
我们之前讲过一个变量的创建是要在内存中开辟空间的。空间的大小是根据不同的类型而决定的。那接下来我们谈谈数据在所开辟内存中到底是如何存储的?比如:int a = 20;int b = -10;我们知道为 a 分配四个字节的空间。那如何存储?下来了解下面的概念:
原码直接将数值按照正负数的形式翻译成二进制就可以得到原码。反码将原码的符号位不变,其他位依次按位取反就可以得到反码。
补码反码+1就得到补码。
下边我们看一个数据存储的例子就好理解了
可以看到,数据在内存是补码存储的,并且是倒着存储的,本质上内存中存放的是2进制,为了方便显示,我们看到的都是16进制的数字(不要害怕不同进制的数字,本质上进制只是表示数字的一种形式)为什么是这样存储的呢接下来我带大家看一下
讲大小端之前我先说明一下原码反码补码的关系(整数原码,反码,补码相同,负数如下)
原码-》补码,先除了符号位按位取反,再+1补码-》原码,先-1,再除了符号位按位取反
我们测试一下这个数据![]()
我们知道数据在内存是从低地址向高地址存储的一个数据的低位字节如果存放在内存的低地址处,代表是小端存储,反之是大端存储
有一道笔试题百度2015年系统工程师笔试题:请简述大端字节序和小端字节序的概念,设计一个小程序来判断当前机器的字节序。(10分)//小端返回1 //大端返回0 int check_sys() {int a = 1;return *(char*)&a; }int main() {int ret = check_sys();if(ret == 1)cout<<"小端"<<endl;elsecout << "大端" << endl;return 0; }
思路是什么呢
我们用char* 强转a的地址,解引用一个字节,如果拿到的是1,代表是小端存储,图上清晰明了很简单

整形家族有这么多类型,我们怎么判断数据在内存的存储呢(注意,数据在内存中一定是以补码存储的,我们计算数据也是计算补码)在vs上我们认为没有unsigned就是有符号类型,有unsigned就是无符号类型,有符号类型第一位存储符号位(正数是0,负数是1),无符号类型每一位都是数值位,一个字节等于8比特位,具体的计算过程上图很明显了(注意:有符号类型第一位符号位不参与计算,只算数值位,所以相对无符号类型的最大值会小一半)

有符号数最高位是1整型提升高位补充符号位1,最高位是0整型提升高位补充符号位0
无符号数整型提升高位补0
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);//-1 -1 255return 0;}先算出补码,后截断,再根据类型整型提升,最后打印(以有符号整形打印需要看最高位,是1说明是负数,需要转化为原码,是0说明是正数,正数原反补相同,直接打印的就是原码,以无符号打印直接补码就是原码(不需要关心符号位,因为无符号数没有符号位,所有位都是数值位)
#include <stdio.h>
int main()
{char a = -1;//10000000000000000000000000000001//11111111111111111111111111111110//11111111111111111111111111111111-截断//11111111 -a//11111111111111111111111111111111//11111111111111111111111111111110//10000000000000000000000000000001--> -1signed char b = -1;//11111111111111111111111111111111//11111111 -bunsigned char c = -1;//11111111 -c//00000000000000000000000011111111//printf("a=%d,b=%d,c=%d", a, b, c);//%d - 十进制的形式打印有符号整型整数//整型提升return 0;
}
2.#include <stdio.h>int main(){char a = -128;printf("%u\n",a);//%u是以十进制形式打印无符号整数return 0;}
//#include <stdio.h>
//int main()
//{
// char a = -128;
// //-128
// //10000000000000000000000010000000//原码
// //11111111111111111111111101111111//反码
// //11111111111111111111111110000000//补码
// //-128的补码
// //10000000//截断
// //11111111111111111111111110000000//有符号最高位补1,进行整型提升
// //
// printf("%u\n", a);
// return 0;
//}
打印42亿多
3.#include <stdio.h>int main(){char a = 128;printf("%u\n",a);return 0;}//这道题跟上边的题结果一样因为截断处都是1000 0000,都是有符号数,以无符号形式打印,所以结果都一样
4.int i= -20;unsigned int j = 10;printf("%d\n", i+j);//按照补码的形式进行运算,最后格式化成为有符号整数//int main() //{ // int i = -20; // //10000000000000000000000000010100 // //11111111111111111111111111101011 // //11111111111111111111111111101100//-20的补码 // // // unsigned int j = 10; // //00000000000000000000000000001010//10的补码 // //11111111111111111111111111101100 // //11111111111111111111111111110110//相加和是补码,要以有符号形式打印,符号位是1是负数,补码要转化为原码进行打印 // //11111111111111111111111111110101 // //10000000000000000000000000001010 -10//转化为原码// printf("%d\n", i + j);//-10 // return 0; //} //
5.unsigned int i;for(i = 9; i >= 0; i--){printf("%u\n",i);}
因为i是无符号整形,数据范围是0到42亿多,所以0--之后会是42亿多(-1的补码是32位全1,所以是42亿多)
6.int main(){char a[1000];int i;for(i=0; i<1000; i++){a[i] = -1-i;}printf("%d",strlen(a));return 0;}
char是有符号char,最多表示-128到127,所以数组里边只会存连续相同的,-1到-128,再从127到0,这是一轮循环,strlen函数是判断长度,到\0结束,因为\0的ascll码值是0,所以strlen到第一轮0就会结束,0之前是255个字符,所以打印255
7. #include <stdio.h> unsigned char i = 0; int main() {for(i = 0;i<=255;i++){printf("hello world\n");}return 0; }
这个就很简单了,无符号char范围是0~255,只要进入循环i永远小于255,所以死循环
浮点型在内存中的存储
常见的浮点数:3.141591E10浮点数家族包括: float、double、long double 类型。浮点数表示的范围:float.h中定义![]()
浮点数存储的例子:#include<iostream> using namespace std; #include <stdio.h>int main() {int n = 9;////0 00000000 00000000000000000001001//S E M//0 -126 0.00000000000000000001001//(-1)^0 * 0.00000000000000000001001 * 2^-126////E在内存中是全0//float* pFloat = (float*)&n;printf("n的值为:%d\n", n);//9printf("*pFloat的值为:%f\n", *pFloat);//0.000000*pFloat = 9.0;//1001.0//1.001 * 2^3//(-1)^0 * 1.001 * 2^3//S=0 E=3 M=1.001//0 10000010 00100000000000000000000//printf("num的值为:%d\n", n);//1091567616printf("*pFloat的值为:%f\n", *pFloat);//9.0return 0; }
先把这个代码放在这,现在先描述一下浮点数如何在内存存储,再返回来看这道题
第一个是float,第二个是double
下边有点长,我把关键部分加粗了,理解起来轻松些
浮点数存储规则num 和 *pFloat 在内存中明明是同一个数,为什么浮点数和整数的解读结果会差别这么大?要理解这个结果,一定要搞懂浮点数在计算机内部的表示方法。详细解读:根据国际标准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。IEEE 754 对有效数字 M 和指数 E ,还有一些特别规定。前面说过, 1≤M<2 ,也就是说,M可以写成 1.xxxxxx 的形式,其中xxxxxx表示小数部分。IEEE 754规定,在计算机内部保存M时,默认这个数的第一位总是1,因此可以被舍去,只保存后面的xxxxxx部分。比如保存1.01的时候,只保存01,等到读取的时候,再把第一位的1加上去。这样做的目的,是节省1位有效数字。以32位浮点数为例,留给M只有23位,将第一位的1舍去以后,等于可以保存24位有效数字。 (提高数字的精度,意思就是说M只存小数位,不够补0)至于指数 E ,情况就比较复杂。首先, E 为一个无符号整数( unsigned int )这意味着, 如果 E为8位,它的取值范围为0~255;如果E为11位,它的取值范围为0~2047 。但是,我们知道,科学计数法中的E是可以出现负数的, 所以IEEE 754 规定,存入内存时E的真实值必须再加上一个中间数,对于8位的E,这个中间数是127;对于11位的E,这个中间数是1023。比如,2^10的E是10,所以保存成32位浮点数时,必须保存成10+127=137,即10001001。然后,指数E从内存中取出还可以再分成三种情况:E 不全为 0 或不全为 1(绝大多数情况,意思就是说怎么放进去怎么拿出来),(放进去+127/1023,拿出来-127/1023)这时,浮点数就采用下面的规则表示, 即指数 E的计算值减去127(或1023),得到真实值,再将有效数字M前加上第一位的1。比如: 0.5(1/2)的二进制形式为0.1,由于规定正数部分必须为1,即将小数点右移1位,则为 1.0*2^(-1),其阶码为-1+127=126,表示为01111110,而尾数1.0去掉整数部分为0,补齐0到23位00000000000000000000000,则其二进制表示形式为:00111111000000000000000000000000E全为0(说明放进去之前是0-127/1023,表示为2^-127/2^-1023,是一个很小的值,可以忽略不计了)(这种情况了解一下就行)这时, 浮点数的指数 E等于1-127(或者1-1023 )即为真实值,有效数字M不再加上第一位的1,而是还原为0.xxxxxx的小数。这样做是为了表示±0 ,以近于0的很小的数字。E 全为 1(说明放进去之前是127/,反正是一个很大的值,也不做重点讨论,了解)这时,如果有效数字M全为0,表示±无穷大(正负取决于符号位s);好了,关于浮点数的表示规则,就说到这里。
#include <stdio.h> int main() {float f = 5.5;//101.1是2进制的5.5//1.011 * 2^2,将2进制类比位10进制进行表示很简单//(-1)^0 *1.011 * 2^2//将对应的数值填入表达式中//S = 0//M = 1.011//E = 2//0100 0000 1011 0000 0000000000000000//0x40b00000return 0; }
对照上边的浮点数存储模型,5.5是单精度浮点数,对照单精度存储结构,S=0,M=1.011,E=2
S第一个位置就填0,E为2放进去要加127是129,二进制是10000001 ,小数点后边有三位是011,M有23比特位,011后边全补0二进制序列就没毛病了,上边我写的也有
换算成16进制是0x40b00000
可以很清晰的看到内存中是小端存储,我们算的是对的,只要按照这个算法99%的浮点数我们都会算。
理解完了这道题,我们还要再看一下刚才那道题
注意,我们以整形存进去并且以整形往出拿,和以浮点型存进去并且以浮点型往出拿的结果都很单纯,以整形存进去但以浮点数往出拿和以浮点数存进去以整形往出拿的结果大大不同。
#include<iostream> using namespace std; #include <stdio.h>int main() {int n = 9;////0 00000000 00000000000000000001001//S E M//0 -126 0.00000000000000000001001//(-1)^0 * 0.00000000000000000001001 * 2^-126////E在内存中是全0//float* pFloat = (float*)&n;printf("n的值为:%d\n", n);//9printf("*pFloat的值为:%f\n", *pFloat);//0.000000*pFloat = 9.0;//1001.0//1.001 * 2^3//(-1)^0 * 1.001 * 2^3//S=0 E=3 M=1.001//0 10000010 00100000000000000000000//printf("num的值为:%d\n", n);//1091567616printf("*pFloat的值为:%f\n", *pFloat);//9.0return 0; }
整数n在内存中正常存储,原码反码补码相同,注意,我们计算的永远是内存中的补码,打印打的是内存中的原码,当把整数int类型以浮点数形式往出拿的时候,根据国际标准IEEE(电气和电子工程协会) 754标准,将内存以SME表示出来,S是0,E是全0,我们刚才说过E是全0,说明我们拿出来是E是-126,M就是0.00000000000000000001001。可以看到,只要根据公式计算,就很简单。(结果是(-1)^0 * 0.00000000000000000001001 * 2^-126 打印结果是0.00000000,一个很小的数,符合我们的预期)
当我们以浮点数的形式存进去,以整数形式拿出来,9.0二进制表示为1001.0,科学计数法是1.001*2^3,根据IEEE协会标准算出来S E M分别是0,3,1.001,再以刚才的规则将其填进内存,最后以有符号形式打印,符号位是0,是正数,以有符号整数打印,正数的原码反码补码相同,将其以原码形式打印出来就是10亿这个数字。很简单吧
以上就是我对数据类型以及数据存储的介绍,感谢支持!!!以后会创作更多的文章
相关文章:
数据在内存的存储
数据类型介绍 前面我们已经学习了基本的内置类型: char //字符数据类型 1字节 打印%c short //短整型 2字节 打印%hd int //整形 4字节 打印%d long long int //长整型 4/8字节 打印%ld l…...
【微服务】面试题 6、分布式事务
分布式事务面试题讲解 一、问题背景与解决方案概述 因微服务项目涉及远程调用可能引发分布式事务问题,需解决。主流解决方案有阿里 Seata 框架(含 XA、AT、TCC 模式)和 MQ。 二、Seata 框架关键角色 事务协调者(TC)&…...
VMware中Ubuntu如何连接网络?安排!
一、设置NAT模式 1、关闭Ubuntu虚拟机: 确保Ubuntu已经完全关机,而不是挂起或休眠状态。 2、编辑虚拟网络设置: 在VMware主界面点击“编辑”菜单,选择“虚拟网络编辑器”。 如果需要,选择VMnet8 (NAT模式)并点击“更改…...
最近在盘gitlab.0.先review了一下docker
# 正文 本猿所在产品的代码是保存到了一个本地gitlab实例上,实例是别的同事搭建的。最近又又又想了解一下,而且已经盘了一些了,所以写写记录一下。因为这个事儿没太多的进度压力,索性写到哪儿算哪儿,只要是新了解到的…...
TCP封装数据帧
void *send_data(void *arg) //这是一个发送数据的线程 {int sockfd init_tcp_cli("192.168.0.148",50000) //传ip和port,port 50000是因为大概前五万都被其它服务所占用,50000后是私人ipif(sockfd < 0){return NULL;}unsigned char …...
基于Springboot+Vue的仓库管理系统
开发一个基于Spring Boot和Vue的仓库管理系统涉及到前端和后端的开发。本文呢,给出一个简单的开发步骤指南,用于指导初入的新手小白如何开始构建这样一个系统,如果**你想直接学习全部内容,可以直接拉到文末哦。** 开始之前呢给小…...
工厂人员定位管理系统方案(二)人员精确定位系统架构设计,适用于工厂智能管理
哈喽~这里是维小帮,提供多个场所的定位管理方案,如需获取工厂人员定位管理系统解决方案可前往文章最下方获取,如有项目合作及技术交流欢迎私信我们哦~撒花 在上一篇文章中,我们初步探讨了工厂人员定位管理系统的需求背景以及定位方…...
机器学习特征重要性之feature_importances_属性与permutation_importance方法
一、feature_importances_属性 在机器学习中,分类和回归算法的 feature_importances_ 属性用于衡量每个特征对模型预测的重要性。这个属性通常在基于树的算法中使用,通过 feature_importances_ 属性,您可以了解哪些特征对模型的预测最为重要…...
Go学习:多重赋值与匿名变量
目录 1. 变量的多重赋值 1.1 基本语法格式 1.2 交换变量值 2. 匿名变量的使用 1. 变量的多重赋值 1.1 基本语法格式 go语言中,可以将多个赋值语句 合并成 一句,比如: a : 10 b : 20 c : 30//a,b,c三个变量的赋值语句可以…...
解读Linux Bridge中的东西流向与南北流向
解读Linux Bridge中的东西流向与南北流向 在现代云计算和虚拟化环境中,网络流量的管理和优化变得越来越重要。Linux Bridge作为Linux内核提供的一个强大的二层交换机工具,在虚拟化和容器化应用中扮演着至关重要的角色。本文将深入探讨Linux Bridge中的两…...
spring mvn 国际化配置
目录 国际化配置测试测试自定义一个MessageSource类型的beanSpringApplicationUtil工具类MessageUtls工具类配置 国际化原理ResourceBundleMessageSource 国际化配置测试 测试 测试: 自定义一个MessageSource类型的bean import org.springframework.context.Mess…...
Windows下Dll在Unity中使用的一般方式
Windows下Dll在Unity中使用的一般方式 Unity中虽然已经有广泛的库和插件,但是相较于C的库生态而言,还是有一定的差距;因此本篇博文记录Windows下将C函数打包成动态链接库在Unity中使用的一般方法。 环境 Visual Studio 2019 , Uni…...
SQLite PRAGMA
SQLite的PRAGMA命令是一种特殊的命令,用于在SQLite环境中控制各种环境变量和状态标志。PRAGMA值可以被读取,也可以根据需求进行设置【0†source】。 PRAGMA命令的语法格式如下: 要查询当前的PRAGMA值,只需提供该PRAGMA的名字&am…...
Linux:进程控制
1.fork()函数初识 在linux中fork函数时非常重要的函数,它从已存在进程中创建一个新进程。新进程为子进程,而原进程为父进程。 #include <unistd.h> pid_t fork(void); 返回值:自进程中返回0,父进程返回子进程id࿰…...
一些计算机零碎知识随写(25年1月)-1
我原以为世界上有技术的那批人不会那么闲,我错了,被脚本真实了。 今天正隔着画画呢,手机突然弹出几条安全告警通知。 急忙打开服务器,发现问题不简单,直接关服务器重装系统..... 首先,不要认为小网站&…...
spring mvc源码学习笔记之十
前面的文章介绍了用 WebApplicationInitializer 或者 AbstractAnnotationConfigDispatcherServletInitializer 来代替 web.xml 。 我们学 java web 的时候就知道,servlet 容器会自动加载 web.xml。 那么,疑问就来了,WebApplicationInitialize…...
网络安全-安全散列函数,信息摘要SHA-1,MD5原理
安全散列函数 单向散列函数或者安全散列函数之所以重要,不仅在于消息认证(消息摘要。数据指纹)。还有数字签名(加强版的消息认证)和验证数据的完整性。常见的单向散列函数有MD5和SHA 散列函数的要求 散列函数的目的是文件、消息或者其它数据…...
《解锁计算机视觉智慧:编程实现图片场景文字描述的开源宝藏》
《解锁计算机视觉智慧:编程实现图片场景文字描述的开源宝藏》 一、MiniGPT-4:小模型撬动大视觉理解(一)项目概览(二)核心亮点(三)上手体验 二、ClipCap-Chinese:中文场景…...
vue封装axios请求
在vue项目中我们发送请求一般是使用axios 我们可以封装axios来避免冗余代码 首先引入axios npm install axios创建环境配置文件 NODE_ENV development VITE_APP_TITLE dev VITE_APP_BASE_API /test VITE_SERVE "http://127.0.0.1"上面是创建dev配置文件 也可以…...
【前端动效】原生js实现拖拽排课效果
目录 1. 效果展示 2. 效果分析 2.1 关键点 2.2 实现方法 3. 代码实现 3.1 html部分 3.2 css部分 3.3 js部分 3.4 完整代码 4. 总结 1. 效果展示 如图所示,页面左侧有一个包含不同课程(如语文、数学等)的列表,页面右侧…...
Python Selenium库入门使用,图文详细。附网页爬虫、web自动化操作等实战操作。
文章目录 前言1 创建conda环境安装Selenium库2 浏览器驱动下载(以Chrome和Edge为例)3 基础使用(以Chrome为例演示)3.1 与浏览器相关的操作3.1.1 打开/关闭浏览器3.1.2 访问指定域名的网页3.1.3 控制浏览器的窗口大小3.1.4 前进/后…...
AI华佗?港中大、深圳大数据研究院提出医疗推理大模型HuatuoGPT-o1
编辑 | 白菜叶 OpenAI o1 的突破凸显了通过增强推理能力来提高自然语言大模型(LLM)的应用潜力。然而,大多数推理研究都集中在数学任务上,而医学等领域尚未得到充分探索。 医学领域虽然不同于数学,但鉴于医疗保健的高…...
openEuler22.03系统使用Kolla-ansible搭建OpenStack
Kolla-ansible 是一个利用 Ansible 自动化工具来搭建 OpenStack 云平台的开源项目,它通过容器化的方式部署 OpenStack 服务,能够简化安装过程、提高部署效率并增强系统的可维护性。 前置环境准备: 系统:openEuler-22.03-LTS-SP4 配置&…...
uni-app无限级树形组件简单实现
因为项目一些数据需要树形展示,但是官网组件没有。现在简单封装一个组件在app中使用,可以无线嵌套,展开,收缩,获取子节点数据等。 简单效果 组件TreeData <template><view class"tree"><te…...
初学stm32 --- ADC单通道采集
目录 ADC寄存器介绍(F1) ADC控制寄存器 1(ADC_CR1) ADC控制寄存器 2(ADC_CR2) ADC采样时间寄存器1(ADC_SMPR1) ADC采样时间寄存器2(ADC_SMPR2) ADC规则序列寄存器 1(ADC_SQR1) ADC规则序列寄存器 2(ADC_SQR2) ADC规则序列寄存器 3(ADC_SQR3) AD…...
css盒子水平垂直居中
目录 1采用flex弹性布局: 2子绝父相margin:负值: 3.子绝父相margin:auto: 4子绝父相transform: 5通过伪元素 6table布局 7grid弹性布局 文字 水平垂直居中链接:文字水平垂直居中-CSDN博客 以下为盒子…...
django基于Python的智能停车管理系统
1.系统概述 1.定义:Django 基于 Python 的智能停车管理系统是一个利用 Django 框架构建的软件系统,用于高效地管理停车场的各种事务,包括车辆进出记录、车位预订、收费管理等诸多功能。 2.目的:它的主要目的是提高停车场的运营效…...
Rabbit Rocket kafka 怎么实现消息有序消费和延迟消费的
在消息队列系统中,像 RabbitMQ、RocketMQ 和 Kafka 这样的系统,都支持不同的方式来实现消息的有序消费和延迟消费。下面我们分别探讨这些系统中如何实现这两种需求: 1. RabbitMQ:实现消息有序消费和延迟消费 有序消费࿱…...
Kafka 会丢消息吗?
目录 01 生产者(Producer) 02 消息代理(Broker) 03 消费者(Consumer) 来源:Kafka 会丢消息吗? Kafka 会丢失信息吗? 许多开发人员普遍认为,Kafka 的设计本身就能保证不会丢失消息。然而,Kafka 架构和配置的细微差别会导致消息的丢失。我们需要了解它如何以及何时…...
状态模式详解与应用
状态模式(State Pattern),是一种行为型设计模式。它允许一个对象在其内部状态改变时改变它的行为,使得对象看起来似乎修改了它的类。通过将不同的行为封装在不同的状态类中,状态模式可以避免大量的条件判断语句&#x…...
红队工具使用全解析:揭开网络安全神秘面纱一角
红队工具使用全解析:揭开网络安全神秘面纱一角 B站红队公益课:https://space.bilibili.com/350329294 学习网盘资源链接:https://pan.quark.cn/s/4079487939e8 嘿,各位网络安全爱好者们!在风云变幻的网络安全战场上&am…...
【Spring】Redis缓存+ehcache
文章目录 基于Spring的RedisehcacheRedis 缓存配置Cacheable 注解CacheEvict 注解缓存配置 基于Spring的Redisehcache Redis 缓存配置 在项目中添加 Redis 的依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot…...
【硬件介绍】Type-C接口详解
一、Type-C接口概述 Type-C接口特点:以其独特的扁头设计和无需区分正反两面的便捷性而广受欢迎。这种设计大大提高了用户的使用体验,避免了传统USB接口需要多次尝试才能正确插入的问题。Type-C接口内部结构:内部上下两排引脚的设计虽然可能不…...
网络传输层TCP协议
传输层TCP协议 1. TCP协议介绍 TCP(Transmission Control Protocol,传输控制协议)是一个要对数据的传输进行详细控制的传输层协议。 TCP 与 UDP 的不同,在于TCP是有连接、可靠、面向字节流的。具体来说,TCP设置了一大…...
Git 基础——《Pro Git》
⭐获取 Git 仓库 获取 Git 仓库有两种方式: 将未进行版本控制的本地目录转换为 Git 仓库。从其他服务器克隆一个已存在的 Git 仓库。 在已存在目录中初始化 Git 仓库 进入目标目录 在 Linux 上:$ cd /home/user/my_project在 macOS 上:$ c…...
数据结构与算法之二叉树: LeetCode 654. 最大二叉树 (Ts版)
最大二叉树 https://leetcode.cn/problems/maximum-binary-tree/ 描述 给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点,其值为 nums 中的最大值递归地在最大值 左边 的 子数组前缀上 构建左子树递归地在最大值…...
学习记录:C++宏定义包含多条语句,使用注意事项
应该使用 do - while(0) 结构的情况 在条件语句(如 if - else、switch - case)或循环语句(如 for、while、do - while)中使用宏: 当宏定义包含多条语句且会在上述语句中使用时,使用 do - while(0) 可确保…...
PHP 使用 Redis
PHP 使用 Redis PHP 是一种广泛使用的服务器端编程语言,而 Redis 是一个高性能的键值对存储系统。将 PHP 与 Redis 结合使用,可以为 Web 应用程序提供快速的读写性能和丰富的数据结构。本文将详细介绍如何在 PHP 中使用 Redis,包括安装、连接、基本操作以及一些高级应用。 …...
项目开发实践——基于SpringBoot+Vue3实现的在线考试系统(五)
文章目录 一、学生管理模块功能实现1、添加学生功能实现1.1 页面设计1.2 前端功能实现1.3 后端功能实现1.4 效果展示2、学生管理功能实现2.1 页面设计2.2 前端功能实现2.3 后端功能实现2.3.1 后端查询接口实现2.3.2 后端编辑接口实现2.3.3 后端删除接口实现2.4 效果展示二、代码…...
下载并安装MySQL
在Linux系统上下载并安装数据库(以MySQL为例)的步骤如下: 一、下载MySQL 访问MySQL官网 打开浏览器,访问MySQL的官方网站:https://www.mysql.com/。 进入下载页面 在MySQL官网首页,找到并点击“Downloads…...
【C++入门】详解(中)
目录 💕1.函数的重载 💕2.引用的定义 💕3.引用的一些常见问题 💕4.引用——权限的放大/缩小/平移 💕5. 不存在的空引用 💕6.引用作为函数参数的速度之快(代码体现) Ǵ…...
计算机视觉算法实战——车道线检测
✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ 车道线检测是计算机视觉领域的一个重要研究方向,尤其在自动驾驶和高级驾驶辅助…...
基于http协议的天气爬虫
该系统将基于目前比较流行的网络爬虫技术, 对网站上的天气数据进行查询分析, 最终使客户能够通过简单的操作, 快速, 准确的获取目标天气数据。主要包括两部分的功能, 第一部分是天气数据查询, 包括时间段数…...
自然语言处理基础:全面概述
自然语言处理基础:全面概述 什么是NLP及其重要性、NLP的核心组件、NLU与NLG、NLU与NLG的集成、NLP的挑战以及NLP的未来 自然语言处理(NLP)是人工智能(AI)中最引人入胜且具有影响力的领域之一。它驱动着我们日常使用的…...
软件架构考试基础知识 002:进程的状态与其切换
进程状态转换的说明 在操作系统中,进程的状态表示其当前的执行情况和资源占用情况。进程状态的转换反映了操作系统如何管理和调度进程。以下是进程状态转换的说明: 1. 三态模型(Three-state Model) 三态模型是最基础的进程状态模…...
【Linux系列】Curl 参数详解与实践应用
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
VsCode对Arduino的开发配置
ps:我的情况是在对esp32进行编译、烧录时,找不到按钮,无法识别Arduino文件,适合已经有ini文件的情况。 1.在vscode中安装拓展 2.打开设置,点击右上角,转到settings.json文件 3.复制以下代码并保存 {"…...
【Pandas】pandas Series rtruediv
Pandas2.2 Series Binary operator functions 方法描述Series.add()用于对两个 Series 进行逐元素加法运算Series.sub()用于对两个 Series 进行逐元素减法运算Series.mul()用于对两个 Series 进行逐元素乘法运算Series.div()用于对两个 Series 进行逐元素除法运算Series.true…...
VUE3 自定义指令的介绍
自定义指令的概述 在 Vue 中,自定义指令是一种机制,允许开发者在模板中直接操作 DOM 元素,执行一些低级别的操作。Vue 提供了几个内置指令(如 v-if、v-for、v-model 等),但当我们需要一些特定功能时&#…...
RedisDB双机主从同步性能测试
安装redisDB 主节点 apt install redis-server修改配置 /etc/redis/redis.conf bind 0.0.0.0save "" # 禁止RDB持久化 #save 900 1 #save 300 10 #save 60 10000appendonly no # 禁止AOF持久化重启服务 systemctl restart redis-server从节点配置文件 bind 0.…...