内存编码手册:整数与浮点数的二进制世界
1.整数在内存中的存储
之前在学习操作符的博文中,我们就已经学习了整数在内存中存储的一些基本知识,我们来快速回忆一下,并开始学习新的知识。
之前的学习中,我们知道整数的二进制表示方法有三种,即原码,反码,补码。真正存放在内存中的其实是补码。三种表示方法均有符号位与数值位两部分,符号位都是用0表示“正”,用1表示“负”,而数值位最高的那一位被认作是符号位,剩余的都是数值位。
正整数的原,反,补码都相同,负整数的三种表示方法各不相同。
原码:直接将数值按照正负数的形式翻译成⼆进制得到的就是原码。
反码:将原码的符号位不变,其他位依次按位取反就可以得到反码。
补码:反码+1就得到补码。
1.1大小端字节序和字节序判断
当我们了解了整数在内存中存储后,我们调试观察一下:
调试的时候,我们可以看到在num中的 0x11223344 这个数字是按照字节为单位,倒着存储的。这是为什么呢?他为什么会按照这个顺序在内存中这样存储?
其实超过一个字节的数据在内存中存储的时候,就会有存储顺序的问题,按照不同的存储顺序,我们将其分为大端字节序存储和小端字节序存储,具体概念如下:
大端(存储)模式:是指数据的低位字节内容保存在内存的高地址处,而数据的高位字节内容,保存在内存的低地址处。小端(存储)模式:是指数据的低位字节内容保存在内存的低地址处,而数据的高位字节内容,保存在内存的高地址处。
我们这时候来看上面这个代码,num的十六进制表示为11223344,44是数据最低位数,在内存划分中它分配在内存中的低地址处,11是数据最高位数,在内存划分中它分配在内存中的高地址处,按照大小端存储定义,我们可以得出该环境下是小端存储模式的结论。
为什么会有大小端模式之分呢?
这是因为在计算机系统中,我们是以字节为单位来存储数据的,每个地址单元都对应着一个字节,一个字节为8个bit位,但是在C语言中除了8bit的char之外,还有16bit位的short,32bit位的long(要看具体的编译器),另外,对于位数大于8位的处理器,例如16位和32位的处理器,由于寄存器宽度大于一个字节,那么必然存在着一个如何将多个字节安排的问题。因此就导致了大端存储模式和小端存储模式。
例如:一个16bit位的short类型num,在内存中的地址为0x5566,num的值为0x1122,那么0x11为数据高位,0x22为数据低位。在大端模式中,就将0x11放在低地址中,0x22放在高地址中。小端模式,则与之相反。我们常用的x86结构式小端模式。
1.2练习
学习了整数在内存中的存储方式之后,我们要想掌握的更好,练习是必不可少的,让我们来做几个题目吧。
1.2.1练习一
//方法一
int main()
{int num = 1;int* pz = #if (*((char*)pz) == 1){printf("小端存储");}elseprintf("大端存储");return 0;
}//方法二,创建函数int test()
{int i = 1;return *(char*)&i;
}int main()
{int ret = test();if (ret == 1){printf("小端存储");}elseprintf("大端存储");return 0;
}
这个练习还是比较简单的,我们首先创建一个整型变量为1(十六进制表示为0x00000001),取出它的地址,再强制转换为char*类型的指针,得到的会是之前int*指针中内存较低的地址,解引用之后如果得到的是1,说明该环境是小端存储模式,不是则为大端存储模式。
1.2.2练习二
#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;
}
这个题的解决需要我们运用到许多知识,计算过程如下:
int main()
{char a = -1;//-1是一个整数,先得到他的补码//11111111 11111111 11111111 11111111//将-1存放到了一个类型为char的变量a中,//由于char类型的变量只能存放8个bit位,所以截取低位8个bit位,变成了11111111//因为结果打印是以%d的形式打印,所以需要进行整型提升,a是有符号的char,最高位又为1,所以高位补1//11111111 11111111 11111111 11111111//转换为原码为10000000 00000000 00000000 00000001//所以结果为-1signed char b = -1;//b的思路与结果与a一摸一样,这里省略(在vs2022中,char类型默认为有符号的char)unsigned char c = -1;//我们还是将-1补码求出//11111111 11111111 11111111 11111111//c是无符号char类型,所以还是截取低位8个bit位,变成11111111//但是我们要注意c是无符号类型的,进行整型提升,最高位应该补的是0//所以原码为00000000 00000000 00000000 11111111//转换为十进制为255printf("a=%d,b=%d,c=%d", a, b, c);return 0;
}
1.2.3练习三
int main()
{char a = -128;printf("%u\n", a);return 0;
}int main()
{char a = 128;printf("%u\n", a);return 0;
}
计算过程如下:
int main()
{char a = -128;//-128//10000000 00000000 00000000 10000000原码//11111111 11111111 11111111 01111111反码//11111111 11111111 11111111 10000000补码//a截取10000000存入地址中,由于打印是以%u的形式打印,所以我们需要对a进行整型提升//a是有符号类型的,最高为符号位为1,所以补1//11111111 11111111 11111111 10000000补码//因为%u打印的是无符号的整数类型,所以该数原,反,补码一样//换算成十进制为4,294,967,168printf("%u\n", a);return 0;
}int main()
{char a = 128;//128原码,反码,补码都相同//00000000 00000000 00000000 10000000//a截取10000000放入地址中,这时我们会发现和上面代码解题步骤和结果都是一样的4,294,967,168//这是为什么呢?printf("%u\n", a);return 0;
}
上面两个代码最后打印出来的结果是一样的,让我们不由得感到疑惑。
其实,signed char(vs2022环境下char默认是signed char)的取值范围是-128~127,也就是说,他根本取不到128这个值,它实际存入的是-128,所以上面代码结果是相同的。我们可以这样理解:
上面的这幅图为我们很好的展示了char类型数据溢出时会在内存中实际存放的数,127之后是-128,-128之后是127。
1.2.4练习四
int main()
{char a[1000];int i;for (i = 0; i < 1000; i++){a[i] = -1 - i;}printf("%d", strlen(a));return 0;
}
这个代码看上去很简单,a[0] = -1,a[1] = -2直到a[999]=-1000循环结束,strlen(a)碰不到\0,并不能算出什么有效数字,事实真的如此吗?我们运行程序看一下结果:
答案是255, 甚至多运行几遍,也是一样的结果,其实这是因为数组a里每个数字里的类型都是char类型,并不是int类型,按照char类型的范围-128~127,-128后面的数字是什么呢?其实是127,在之后不断减一,最后在第256个时,strlen碰到了\0,停止了计算。
1.2.5练习五
//代码一
unsigned char i = 0;
int main()
{for (i = 0; i <= 255; i++){printf("hello world\n");}return 0;
}//代码二
int main()
{unsigned int i;for (i = 9; i >= 0; i--){printf("%u\n", i);}return 0;
}
上面两段代码的结果都是死循环。
代码一i是无符号char类型变量,取值范围为0~255,所以无论i怎么加,他在内存中实际存放的值都不可能超过255 ,for循环会一直持续下去。
代码二也是一样的道理,不管i如何减,他在内存中实际存放的数值都不可能小于0,也会死循环。
1.2.6练习六
int main()
{int a[4] = { 1, 2, 3, 4 };int* ptr1 = (int*)(&a + 1);int* ptr2 = (int*)((int)a + 1);printf("%x,%x", ptr1[-1], *ptr2);return 0;
}
计算过程:
int main()
{int a[4] = { 1, 2, 3, 4 };int* ptr1 = (int*)(&a + 1);//&a取出整个数组的地址,大小为四个字节,加一之后往后跳四个字节//然后强制转换成int*类型的指针,该指针实际上就是整个数组地址的后一个字节//ptr[-1]可以转为*(ptr-1),指向的是数组最后一个元素的地址,数值为4int* ptr2 = (int*)((int)a + 1);//a为首元素地址,强制转换为整数类型,整数加一就是数值层面加一//再将和强转为整形指针,它实际是数组首元素的后三个字节加上数组第二个元素的第一个字节//数组的第一个元素四个字节内容:01 00 00 00//数组的第二个元素四个字节内容:02 00 00 00//所以实际结果是00 00 00 02//该环境为小端存储模式,所以结果为02000000printf("%x,%x", ptr1[-1], *ptr2);return 0;
}
有些同学可能不是很能理解(int*)((int)a + 1)这个式子,我们举个例子,a的地址为0x10,我们将他转换之后加一,变成了0x11,然后又转为指针,地址变成了0x11,指向的内容就往后顺延了一个字节。
2.浮点数在内存中的存储
在学习浮点数在内存存储的方式之前,我们先来看一个例子:
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;
}
我们是不是很容易想到答案,答案依次为:9,9.000000,9,9.000000,答案真的是这样吗?我们运行代码:
我们的答案跟正确答案有一半是对的,还有一半则是完全不对,其实这源于整数与浮点数在内存中完全不同的存储方法。
根据国际标准IEEE(电气和电子工程协会) 754,任意⼀个二进制浮点数V可以表示成下面的形式:
V = (-1)^ S * M * 2 ^ E
• (-1)^S表示符号位,当S=0时,V为正数;当S=1时,V为负数
• M表示有效数字,M是大于等于1,小于2的
• 2^E表示指数位
举个例子:5.5,二进制表示为101.1,相当于1.011*2^2
可以得到S=0,M=1.011,E=2
IEEE 754规定:对于32位的浮点数,最高的1位存储符号位S,接着的8位存储指数E,剩下的23位存储有效数字M对于64位的浮点数,最高的1位存储符号位S,接着的11位存储指数E,剩下的52位存储有效数字M


IEEE 754 对有效数字M和指数E,还有⼀些特别规定。
M:
前面说过, 1 ≤ M<2 ,也就是说,M可以写成 1.xxxxxx 的形式,其中 xxxxxx 表示小数部分。IEEE 754 规定,在计算机内部保存M时,默认这个数的第⼀位总是1,因此可以被舍去,只保存后⾯的xxxxxx部分。比如保存1.01的时候,只保存01,等到读取的时候,再把第⼀位的1加上去。这样做的目的,是节省1位有效数字。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:这时,浮点数的指数E等于1-127(或者1-1023)即为真实值,有效数字M不再加上第⼀位的1,而是还原为0.xxxxxx的小数。这样做是为了表示±0,以及接近于0的很小的数字。E全为1这时,如果有效数字M全为0,表示±⽆穷⼤(正负取决于符号位s);
int main()
{int n = 9;float* pFloat = (float*)&n;printf("n的值为:%d\n", n);//9printf("*pFloat的值为:%f\n", *pFloat);//0.000000//9的补码为://00000000 00000000 00000000 00001001//当一个浮点数的浮点数指向这一片被强转空间后,我们可以得到E为全0//所以*pFloat是一个很小很小的数字*pFloat = 9.0;printf("num的值为:%d\n", n);//9.0的二进制表示为1001.0,可以转换为1.001*2^3,写成://0 10000010 00100000000000000000000//转换为十进制为:1,091,567,616printf("*pFloat的值为:%f\n", *pFloat);//9.000000return 0;
}
相关文章:
内存编码手册:整数与浮点数的二进制世界
1.整数在内存中的存储 之前在学习操作符的博文中,我们就已经学习了整数在内存中存储的一些基本知识,我们来快速回忆一下,并开始学习新的知识。 之前的学习中,我们知道整数的二进制表示方法有三种,即原码,…...
铷元素的市场供需情况如何?
铷元素的市场供需格局呈现出显著的稀缺性与战略价值,其供应高度依赖锂矿开采的副产品,而需求则随着高科技产业的快速发展持续攀升。以下从供应、需求、价格、政策及可持续性五个维度展开分析: 一、供应端:资源稀缺与技术瓶颈并存…...
MATLAB 程序实现了一个层次化光网络的数据传输模拟系统
% 主程序 num_pods = 4; % Pod 数量 num_racks_per_pod = 4; % 每个 Pod 的 Rack 数量 num_nodes_per_rack = 4; % 每个 Rack 的 Node 数量 max_wavelength = 50; % 可用波长数(根据冲突图动态调整) num_packets = 1000; % 模拟的…...
LFI to RCE
LFI不止可以来读取文件,还能用来RCE 在多道CTF题目中都有LFItoRCE的非预期解,下面总结一下LFI的利用姿势 1. /proc/self/environ 利用 条件:目标能读取 /proc/self/environ,并且网页中存在LFI点 利用方式: 修改请…...
QT6 源(34):随机数生成器类 QRandomGenerator 的源码阅读
(1)代码来自 qrandom.h ,结合官方的注释: #ifndef QRANDOM_H #define QRANDOM_H#include <QtCore/qalgorithms.h> #include <algorithm> // for std::generate #include <random> // for std::mt1993…...
极狐GitLab GEO 功能介绍
极狐GitLab 是 GitLab 在中国的发行版,关于中文参考文档和资料有: 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitLab 官网 Geo (PREMIUM SELF) Geo 是广泛分布的开发团队的解决方案,可作为灾难恢复策略的一部分提供热备份。Geo 不是 开箱…...
快速上手,OceanBase + MCP + LLM,搭建 AI 应用
在 AI 技术发展的进程中,大语言模型(LLM)凭借卓越的信息处理与推理能力广受重视。然而,数据孤岛问题仍是 LLM 面临的核心挑战。目前,LLM 的推理主要依赖于预先训练的数据和有限的上下文窗口,既无法动态访问…...
【Python爬虫基础篇】--1.基础概念
目录 1.爬虫--定义 2.爬虫--组成 3.爬虫--URL 1.爬虫--定义 网络爬虫,是一种按照一定规则,自动抓取互联网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。随着网络的迅速发展,万维网成为大量信息的载体…...
Linux :进程替换
进程替换 (一)进程程序替换1.替换原理2.替换函数exec函数命名理解 (二)实现简易shell (一)进程程序替换 1.替换原理 用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往…...
XC7K410T‑2FFG900I 赛灵思XilinxFPGA Kintex‑7
XC7K410T‑2FFG900I Xilinx 赛灵思FPGA Kintex‑7 系列定位:Kintex‑7 中端,高性价比与高性能平衡 工艺节点:28 nm HPL(High‑Performance, Low‑Power)HKMG(High‑κ Metal Gate) 逻辑资源&…...
list容器介绍及模拟实现和与vector比较
目录 list容器介绍 lisy接口 list迭代器的注意事项 迭代器失效 list的模拟实现 list的节点 list的迭代器实现 list的接口实现 vector和list的优缺点 vector优点: vector缺点: list优点: list缺点: 总结: …...
[图论]Prim
Prim 本质:BFS贪心,对点进行操作。与最短路Dijkstra算法是“孪生兄弟”。存储结构:链式前向星适用对象:可为负权图,可求最大生成树核心思想:最近的邻接点一定在最小生成树(MST)上,对点的最近邻…...
【python】pysharm常用快捷键使用-(1)
*1.格式化代码【Ctrl Alt L】 写代码的时候会有很多黄色的波浪号(如图)又叫蚂蚁线,可以点击任意黄色波浪号的代码,然后按下【Ctrl Alt L】进行代码格式化。 2.添加函数功能和参数注释 添加函数文档字符串 docstring 在函数…...
06-DevOps-自动构建Docker镜像
前面已经完成了jar文件的打包和发布,但在实际使用时,可能会遇到外部依赖环境发生改变,为了解决这些问题,更多的做法是把应用程序以docker镜像,生成容器的方式运行,这是一种标准化的方式。 创建Dockerfile文…...
案例驱动的 IT 团队管理:创新与突破之路:第五章 创新管理:从机制设计到文化养成-5.2 技术决策民主化-5.2.2技术选型的量化评估矩阵
👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 案例驱动的 IT 团队管理:创新与突破之路 - 第五章 创新管理:从机制设计到文化养成 - 5.2 技术决策民主化5.2.2 技术选型的量化评估矩阵一、技术选型的…...
力扣面试150题--有效的字母异位词和字母异位词分组
Day 24 题目描述 思路 初次思路:如果两个字符串为异位词,说明它们长度相同并且字母出现的次数相同,于是有以下做法: 定义一个map,来保存s中每个字符的出现次数处理特殊情况,如果长度不同,直接…...
WSL2-Ubuntu22.04安装URSim5.21.3
WSL2-Ubuntu22.04安装URSim5.21.3 准备安装启动 准备 名称版本WSL2Ubuntu22.04URSim5.21.3VcXsrvNaN WSL2安装与可视化请见这篇:WSL2-Ubuntu22.04-配置。 安装 我们是wsl2-ubuntu22.04,所以安装Linux版本的URSim,下载之前需要注册一下,即…...
配合 Spring Bean 注入,把 Function 管理起来?
大家好呀!今天我们来聊聊一个特别有意思的话题 - 如何在Spring中优雅地管理和注入Function对象。就像把各种调料整齐地摆在厨房里一样,我们要把各种函数方法也管理得井井有条!🍳 一、为什么要把Function管起来?&#…...
Wireshark TS | 异常 ACK 数据包处理
问题背景 来自于学习群里群友讨论的一个数据包跟踪文件,在其中涉及到两处数据包异常现象,而产生这些现象的实际原因是数据包乱序。由于这两处数据包异常,都有点特别,本篇也就其中一个异常现象单独展开说明。 问题信息 数据包跟…...
vue3 el-dialog新增弹窗,不希望一进去就校验名称没有填写
就是在进入弹窗时、点击关闭/取消按钮时等情况清空该表单校验,在失去焦点或者点击确定/提交按钮的时候再去校验。这里默认已经写好了在失去焦点或者点击确定/提交按钮的时候的校验逻辑。 解决步骤: 一、定义清空表单校验方法 // 清空表单校验const cle…...
【2-12】CRC循环冗余校验码
前言 前面我们介绍了纠错码——海明码,同时还说明了为什么现代网络常用检错重传而不是纠错,本文介绍CRC循环冗余校验码。 文章目录 前言1. 简单定义2. 生成规则3. 例题3.1 例13.2 例2 后记修改记录 1. 简单定义 CRC(Cyclic Redundancy Chec…...
多 Agent 协作怎么整:从谷歌A2A到多Agent交互方案实现
写在前面:多 Agent 协作模式 大型语言模型(LLM)的浪潮之下,能够自主理解、规划并执行任务的 AI Agent(智能体)正成为人工智能领域最炙手可热的焦点。我们惊叹于单个 Agent 展现出的强大能力,但当面对日益复杂的现实世界任务时,单个 Agent 的局限性也逐渐显现。 正如人…...
内部聊天软件,BeeWorks-安全的企业内部通讯软件
企业在享受数据便利的同时,如何保障企业数据安全已经成为无法回避的重要课题。BeeWorks作为一款专为企业设计的内部通讯软件,通过全链路的安全能力升维,为企业提供了一个安全、高效、便捷的沟通协作平台,全面保障企业数据安全。 …...
健康养生:开启活力生活的密钥
当我们在健身房看到年逾六旬却身形矫健的老人,在公园偶遇精神矍铄、步伐轻快的长者,总会惊叹于他们的健康状态。其实,这些都得益于长期坚持科学的养生之道。健康养生并非遥不可及的玄学,而是融入生活细节的智慧。 在饮食的世界…...
士兵乱斗(贪心)
问题 B: 士兵乱斗 - USCOJ...
Android 不插SIM卡,手机不能拨打紧急电话;2g+gsm配置才支持112紧急拨号
[DESCRIPTION] 不插SIM卡,手机不能拨打紧急电话 Root Cause 手机没有写入合法的IMEI;或者当地的某个运营商不支持紧急电话,而手机正好选上了这个运营商;或者当地的某个运营商不支持无SIM卡的紧急电话,而手机正好选上了这个运营商 [SOLUTION] …...
Freertos----信号量
一、信号量的特性: 生产者为任务A、B,消费者为任务C、D一开始信号量的计数值为0,如果任务C、D想获得信号量,会有两种结果: 阻塞:买不到东西咱就等等吧,可以定个闹钟(超时时间)即刻返回失败&…...
AI 数字短视频数字人源码开发的多元价值与深远意义
在短视频行业竞争日益激烈的当下,AI 数字短视频数字人源码开发正以颠覆性的姿态,为行业带来诸多前所未有的优势,从创作、传播到商业变现等环节,全面重塑短视频生态。 创新创作模式,激发无限创意 传统短视频创作受…...
Apifox下载安装与使用
一、Apifox下载 官网地址:Apifox 点击"免费下载",即可进行下载。 二、Apifox安装 双击安装文件即可安装。...
命令行参数解析 - argparse 模块
1、简介 argparse 模块是 Python 标准库中提供的一个 命令行解析模块 ,它可以让使用者以类似 Unix/Linux 命令参数的方式输入参数(在终端以命令行的方式指定参数),argparse 会自动将命令行指定的参数解析为 Python 变量ÿ…...
【Android】 如何将 APK 内置为系统应用(适用于编辑设置属性)
如何将 APK 内置为系统应用(适用于编辑设置属性) 在 Android 中,将 APK 文件内置为系统应用涉及到一系列的命令和步骤。以下是详细的操作流程,帮助您解决常见问题,如 /system not in /proc/mounts 的错误。 挂载system/app获取可读写权限 …...
随手笔记-python-opencv 读取图像的顺序 与pytorch处理图像的顺序
import cv2# 读取图像 image_path path/to/your/image.jpg # 替换为你的图像路径 image cv2.imread(image_path)# 检查图像是否成功读取 if image is None:print("Error: Unable to load image.") else:print("Image loaded successfully.") 1、OpenCV…...
996引擎-实战笔记:Lua 的 NPC 面板获取 Input 内容
996引擎-实战笔记:Lua 的 NPC 面板获取 Input 内容 获取 Input 内容测试NPC参考资料获取 Input 内容 测试NPC -- NPC入口函数 function main(player)local msg = [[<Img|id=9527|x=0|y=0|width=300|height=150|img=public/bg_npc_01.png|bg=1|move=1|reset=1|show=0|layer…...
少数服从多数悖论、黑白颠倒与众人孤立现象之如何应对(一)
观己之前,也可先观众生 如果当时没有袖手旁观,或许唇不亡齿也不会寒 ■如何轻松/更好应对个别被众人孤立(他人、辨别、自己) ●他人被孤立 不参与 有余力,助弱者 被孤立者本身有问题 •不参与:不会辨…...
大模型在急性单纯性阑尾炎预测及治疗方案制定中的应用研究
目录 一、引言 1.1 研究背景与意义 1.2 研究目的 1.3 研究方法与创新点 二、急性单纯性阑尾炎概述 2.1 定义与发病机制 2.2 临床表现 2.3 传统诊断方法 三、大模型在急性单纯性阑尾炎预测中的应用 3.1 大模型简介 3.2 数据收集与处理 3.3 模型训练与优化 3.4 预测…...
科研新触角:松灵六轴臂重构具身智能生态
在具身智能(Embodied AI)从实验室走向产业化的进程中,硬件性能与场景适配性成为技术落地的核心瓶颈。松灵机器人推出的全自研科研级轻量六轴机械臂PiPER,以“轻量化设计毫米级精度跨平台兼容”三大技术突破,重新定义了…...
第四讲 感应熔炼电炉设计和感应器参数计算(中)
第四讲 感应熔炼电炉设计和感应器参数计算(中) 目录 第四讲 感应熔炼电炉设计和感应器参数计算(中)磁轭、短路环、消磁环、水冷圈的设计1. 磁轭的设计1.1 磁轭的作用1.2 磁轭的材料1.3 磁轭截面设计1.4 磁轭高度的确定1.5 磁轭总重…...
【Contiki】Contiki源码目录结构
00. 目录 文章目录 00. 目录01. 概述02. Contiki目录结构03. apps目录04. core目录05. CPU目录06. doc目录07. examples目录08. platform目录09. regression-tests目录10. tools目录11. 附录 01. 概述 Contiki是一款开源操作系统,专为微小的低功耗微控制器设计&…...
第五章 SQLite数据库:3、SQLite 常用语法及使用案例
SQLite Insert 语句 SQLite 的 INSERT INTO 语句用于向表中添加新数据行。 语法 INSERT INTO 有两种常见语法形式: 使用列名指定要插入的列: -- 插入数据并指定列名 INSERT INTO TABLE_NAME (column1, column2, ..., columnN) VALUES (value1, va…...
【安卓开发】【Android Studio】Menu(菜单栏)的使用及常见问题
一、菜单栏选项 在项目中添加顶部菜单栏的方法: 在res目录下新建menu文件夹,在该文件夹下新建用于菜单栏的xml文件: 举例说明菜单栏的写法,只添加一个选项元素: <?xml version"1.0" encoding"ut…...
web-ssrfme
SSRF漏洞 SSRF是Server-Side Request Forgery(服务器端请求伪造)的缩写,是一种网络攻击技术。攻击者发送恶意请求给目标服务器,让服务器去访问攻击者指定的其他服务器或者域名,从而获取敏感信息或者攻击其他系统。 S…...
Linux:进程:进程状态
进程是一个负责分配系统资源(CPU时间,内存)的实体。 进程内核数据结构(用于描述和组织进程)代码数据(实际内容) 描述进程-PCB 进程信息被放在⼀个叫做进程控制块的数据结构中,简称…...
NoSQL 与 NewSQL 全面对比:如何选择适合你的数据库方案?
1. 引言 随着互联网业务的爆发式增长,传统关系型数据库(RDBMS)面临着越来越大的挑战。海量数据存储、高并发访问、低延迟响应等需求促使技术团队寻找更适合的解决方案。在这一背景下,NoSQL 和 NewSQL 作为两种不同方向的技术路线…...
在 MoonBit 中引入 Elm 架构:用简单原则打造健壮的 Web 应用
Elm 是一种纯函数式编程语言,专为构建前端 Web 应用程序而设计。它编译为 JavaScript,强调简洁性、性能和健壮性。 纯函数式的含义是函数没有副作用,这使得代码更易于理解和调试。通过强大的静态类型检查,Elm 确保应用程序不会抛…...
虚幻基础:ue引擎的碰撞
文章目录 碰撞:碰撞体间 运动后 产生碰撞的行为——由引擎负责,并向各自发送事件忽略重叠阻挡 碰撞体类型模式纯查询:不清楚具体作用可以阻挡 actor碰撞(武器:刀/子弹)子组件可以产生阻挡 角色的碰撞只有根组件可以阻挡࿰…...
「电商玩法」AI自动创作系统源码:商品图+视频+营销文案一键生成
—零代码搭建智能内容工厂,1人日更1000条爆款素材 电商行业核心痛点 1. 内容产能不足 中小商家无力承担专业摄影/剪辑,商品图质量差→转化率<1%热点借势慢:竞品已开始推“淄博烧烤同款”,你的素材还在拍摄中 2. 成本居高不下…...
图形变换算法
一、学习目的 (1)掌握多面体的存储方法。 (2)掌握图形的几何变换及投影变换。 (3)掌握三维形体不同投影方法的投影图的生成原理。 (4)掌握多面体投影图绘制的编程方法。 二、学…...
no such window: target window already closed的解决方法
我在使用selenium 切换窗口的时候,由于不小心关闭了一个窗口,运行的时候就遇到这样的警告: no such window: target window already closed 具体的问题展示: 这个问题表示:当前的页面被关闭了,selenium 找…...
vue常见错误
1、 Cant resolve vant/lib/index.less 1. 未正确安装 Vant 首先,确保你已经正确安装了 Vant。可以通过以下命令来安装: npm install vant --save 或者使用 yarn: yarn add vant 2. LESS 加载器未配置 如果你在项目中使用了 Vant 的 L…...
chrome中的copy xpath 与copy full xpath的区别
学过测试或者爬虫的,都感觉获取网页元素,使用xpath最方便 但其中有一些细节可能会使你摸不清头脑 比如有时候copy xpath会定位不准确,而使用copy full xpath就可以定位 1、copy xpath(相对路径定位) 优点ÿ…...