【C语言加油站】数据在内存中的存储

news2024/9/30 2:07:03

数据在内存中的存储

  • 导读
  • 一、计算机中的数据类型
  • 二、整数在计算机中的存储
    • 2.1 整数的存储形式——原码、反码与补码
    • 2.2 三种形式之间的相互转换
    • 2.3 采用补码存储整数的原因
  • 三、大小端字节序与字节序判断
    • 3.1 大端存储与小端存储
    • 3.2 为什么会出现大小端存储?
    • 3.3 大端存储与小端存储的判断
  • 四、浮点数在计算机中的存储
    • 4.1 浮点数的表示格式
    • 4.2 浮点数的数据范围
    • 4.3 浮点数的二进制形式
    • 4.4 浮点数的存储
    • 4.5 浮点数的获取
    • 4.6 注意事项
  • 五、浮点数与整数的相关问题探讨
    • 5.1 整数与浮点数之间的隐式类型转换
    • 5.2 强制类型转换
    • 5.3 小结
  • 结语

封面

导读

大家好,很高兴又和大家见面啦!!!

我们知道,计算机刚开始问世时主要是用于计算导弹的弹道的,因此计算机就需要具备比较强大的计算功能。而在进行计算时肯定是无法摆脱一个问题——计算的数据如何存储。

在前面的学习中我们简单的了解了一下整型在计算机中的存储,可是导弹的弹道并不会正正好好都是使用的整型运算,其中肯定会夹杂着各种各样的浮点型的数据的运算,那么浮点型的数据在内存中又是应该如何进行存储的呢?在今天的内容中我们将会详细的探讨计算机中的数据的存储方式……

一、计算机中的数据类型

在C语言中我们学习的数据类型有7个基本类型:字符类型、短整型、整型、长整型、更长的整型、单精度浮点型、双精度浮点型……当然还有像布尔类型、指针类型等等的其它数据类型。但是计算机在对不同类型的数据进行存储时,并不会将其进行区分,都是统一的以二进制的形式来存储各式各样的数据。

在我看来像字符型、布尔类型、指针类型……这些我们都可以看做是整型的拓展类型。

比如在字符类型中,每一个字符有与其对应的整型值;在布尔类型中,无非就是两个值——truefalse,它们同样有对应的整型值——10;在指针类型中,数据则是以十六进制的形式进行存储的,对于十六进制的数据而言,我们同样可以将其转换成十进制的整型数据。

因此,在计算机中真实进行存放的数据类型实际上就是两种类型——整型与浮点型。接下来我们将会分别探讨整型数据在计算机中的存储与浮点型的数据在计算机中的存储。

二、整数在计算机中的存储

2.1 整数的存储形式——原码、反码与补码

在计算机中,整数分为无符号整数和有符号整数。

在之前我们有学习过,对于有符号整数而言,数值的二进制表示有三种形式——原码、反码与补码。
这三种表示形式都是由符号位与数值位两部分组成。符号位指的是二进制序列中的最高位:

  • 符号位为0表示正数
  • 符号位为1表示负数

数值位指的数除最高位以外的剩余的二进制位,因此对于一个int类型的数据而言,其正数的范围是 0 ~ 2 31 − 1 0~2^{31}-1 02311,其负数的范围是 − 2 31 ~ − 1 -2^{31}~-1 2311

计算机在存储有符号整数时,无论正负,存储在内存中的都是其对应的补码

而无符号整数所对应的二进制形式只有一种——通过数值的进制运算获取的二进制序列。我们可以将其理解为在无符号整数中,其二进制位都是数值位,不存在符号位。因此,无符号整型在内存中进行存储时,存储的是其数值所对应的二进制序列。

2.2 三种形式之间的相互转换

在有符号正整数中其数值所对应的三种二进制形式是相等的,即: 原码 = 反码 = 补码 原码 = 反码 = 补码 原码=反码=补码,因此我们通过进制转换获取到数值所对应的原码时,同时也获得了其对应的反码与补码。

在有符号负整数中其数值所对应的三种二进制形式是不同的,我们需要通过相应的转换才能获取其对应的二进制形式:

  • 原码——通过数值的进制转换直接获取
  • 反码——通过原码的数值位按位取反进行获取
  • 补码——通过反码+1进行获取

这里我们可以通过编写一个函数来进行验证,如下所示:

有符号整数的原码反码与补码
这里我们通过函数分别获取到了数值3与-3在内存中存储的二进制序列。

当我们对3进行进制转换时,我们可以很容易的得到其对应的二进制序列为:

0000 0000 0000 0000 0000 0000 0000 0011

那么-3所对应的二进制序列则为:

1000 0000 0000 0000 0000 0000 0000 0011

但是从程序的输出结果中来看,我们会发现正数3的结果与我们直接计算获取的结果是一致的,而负数-3的结果与我们直接计算获取的结果是有差距的,而它们之间的差距正号就是前面我们介绍的负数补码的获取方式——原码按位取反再加1。

有细心的朋友会发现,对于负数的补码而言,如果我们将其进行按位取反再加1同样也能够得到其原码,因此对于负整数而言,其原码与补码之间的转换都可以通过按位取反再加1的方式获取。

从这次的测试结果我们可以得到以下结论:

  1. 有符号整数在内存中是以补码的形式进行存储
  2. 正整数的原码、反码与补码相等
  3. 负整数的原码按位取反得反码,反码+1得补码
  4. 负整数的补码按位取反再+1得原码

2.3 采用补码存储整数的原因

计算机在存储整数时之所以统一采用补码的方式,是因为使用补码,可以将符号位和数值域统一处理;

同时,加法和减法也可以统一处理(CPU只有加法器)此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。

三、大小端字节序与字节序判断

现在我们已经知道了对于无符号整型的数据而言,它们在内存中是直接以二进制的形式进行存储,而对于有符号整型而言,它们在内存中则是以补码的形式进行存储。

计算机在存储数据时,不同的数据类型所占用的内存空间也不相同:

  • 字符类型/布尔类型占用1个字节的空间
  • 短整型占用2个字节的空间
  • 整型/单精度浮点型/指针类型占用4个字节的内存空间
  • 长整型/双精度浮点型占用8个字节的内存空间(在有些环境中长整型也是占用4个字节)

对于这些内存所需内存空间超过1个字节的数据而言这时我们很容易的想到,它们在内存中可能是从高位到低位依次进行存储,也可能是从低位到高位依次进行存储。那它们在内存中具体是如何进行存储的呢?下面我们就需要来了解一下数据存储的两种方式——大端存储与小端存储。

3.1 大端存储与小端存储

大端存储,我们可以理解为数据从高位到低位依次存储——高位的数据存放在低地址处,低位的数据存放在高地址处;

小端存储,我们可以理解为数据从低位到高位依次存储——低位的数据存放在低地址处,高位的数据存放在高地址处;

这里的低位与高位指的是数据所对应的二进制位,如下所示:

int a = 0x11223344;

对于这个整型变量而言,其低字节处的数值为十六进制的44,高字节处的数值为十六进制的11;而在函数栈帧中我们有介绍过,在内存中,从上往下,地址逐渐增加,因此高地址位于内存的下方,低地址位于内存的上方。

因此,当我们通过大端存储的方式来存储该变量时,该变量的数值在内存中应该是以低字节存储在高地址,高字节存储在低地址的方式顺序存储,即通过0x11223344的方式进行进行存储,从上往下以单字节的形式表示则是:

11——不打印字符
22——"
33——3
44——D

左侧内容为存储的十六进制的数值,右侧内容为该数值所对应的ASCII码值中的字符。当我们通过小端存储的方式来存储该变量时,其数值在内存中应该是以低字节存储在低地址处,高字节存储在高地址处的方式逆序存储,即通过0x44332211的方式进行存储,从上往下以单字节的形式表示则是:

44——D
33——3
22——"
11——不打印字符

接下来我们就来通过内存窗口来验证一下该变量在内存中是如何进行存储的:

大端与小端存储
从内存窗口中我们不难发现,该数值的存储方式符合小端存储的方式。那是不是说明数据在内存中就是以小端存储的方式进行存储的呢?

实际上不管是大端存储还是小端存储都是计算机存储数据的方式,只不过在不同的环境中,计算机所采用的存储方式不相同,比如在x86的环境中,计算机采用的是小端存储的方式来存储数据,而KEIL C51 中则是通过大端存储的方式来存储数据。

3.2 为什么会出现大小端存储?

这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为8
bit 位,但是在C语言中除了8 bit 的char 之外,还有16 bit 的short 型,32 bit 的long 型(要看
具体的编译器),另外,对于位数大于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,那么必然存在着一个如何将多个字节安排的问题。因此就导致了大端存储模式和小端存储模式。

也就是说,不管是大端存储还是小端存储我们都需要根据具体的存储环境来进行判断,并且当一个数据存储在内存中时,我们可以根据数据的存储顺序来进行区分:

  • 从高位到低位顺序存储的是大端存储
  • 从高位到低位逆序存储的是小端存储

3.3 大端存储与小端存储的判断

在了解了什么大小端存储之间的区别后,接下来如果我们要判断所使用的环境为哪种存储方式时,我们只需要通过获取首字节的元素的值即可进行判断。

比如,当我们在存储值0x00000001时,如果环境采用的是大端存储,那么其首字节的值应该是0,如果采用的是小端存储,其首字节的值应该是1,因此,我们就可以首字节的值来进行具体的判断,如下所示:

大小端存储的判断
当然,如果我们在今后面试的过程中有遇到需要判断该环境为大端存储还是小端存储时,如果在已知了数据在内存中的存储形式,我们可以通过数值的存储顺序来进行判断;如果未知数值的存储形式,我们则可以通过该代码来进行判断。

四、浮点数在计算机中的存储

浮点数在内存中同样是以二进制的形式进行存储,相比于有符号整型的符号位与数值为的存储形式,浮点数在存储时,是采用的另一中存储形式来存储数据。

4.1 浮点数的表示格式

根据国际标准IEEE(电气和电子工程协会) 754,任意一个二进制浮点数V可以表示成下面的形式:
V = ( − 1 ) S ∗ M ∗ 2 E V = (−1)^S ∗ M ∗ 2^E V=(1)SM2E

  • ( − 1 ) S (−1)^S (1)S表示符号位,当S = 0,V为正数;当S = 1,V为负数
  • M 表示有效数字,M是大于等于1,小于2的
  • 2 E 2^E 2E 表示指数位

4.2 浮点数的数据范围

在浮点数中有float类型、double类型以及long double类型,其数据类型的数据范围存在于头文件<float.h>中。如下所示:

浮点数的取值范围
这里我们展示的是正浮点数的取值访问,对于浮点数而言,它在不同条件下的取值范围都被整合在了该头文件中,有兴趣的朋友可以对照头文件的内容来尝试打印不同条件下的浮点数的取值范围,头文件网址给大家奉上:<float.h>大家点击链接即可进入对应的网站,这里我就不再过多的赘述。

4.3 浮点数的二进制形式

浮点数在进行存储时,其对应的二进制形式与其表示格式一样,被分为了3个部分——S、E、M。

  • 最高位表示符号位,存储S的值:
    • S=0,表示正数
    • S=1,表示负数
  • S之后存储E的值,此时的E表示的是无符号整型:
    • 32位中,S后的8个比特位存储的是E的值,在进行存储时为了避免负值的出现,需要加上中间值127,再进行存储
    • 64位中,S后的11个比特位存储的是E的值,在进行存储时为了避免负值的出现,需要加上中间值1023,再进行存储
  • E之后存储的是M的值,此时的M表示的是一个 1 < = M < = 2 1<=M<=2 1<=M<=2的值,在存储时只存储小数部分:
    • 32位中,E后的23个比特位用于存储M的值,从左到右依次表示的是 2 − 1 ~ 2 − 23 2^{-1}~2^{-23} 21223
    • 64位中,E后的52个比特位用于存储M的值,从左到右依次表示的是 2 − 1 ~ 2 − 52 2^{-1}~2^{-52} 21252

如下图所示:

浮点数的二进制形式

4.4 浮点数的存储

当我们要存储一个浮点数时,我们需要通过以下几个步骤:

  1. 获取浮点数对应的二进制数值,如5.5对应的二进制数值为101.1;
  2. 将二进制数值改写成科学计数法的形式,如101.1改写成 1.011 × 2 2 1.011 × 2^2 1.011×22
  3. 将科学计数法的形式改写成浮点数的格式:如 1.011 × 2 2 1.011 × 2^2 1.011×22改写成 ( − 1 ) 0 × 1.011 × 2 2 (-1)^0 × 1.011 × 2^2 (1)0×1.011×22
  4. 获取浮点数格式中的 S E M SEM SEM值,如 ( − 1 ) 0 × 1.011 × 2 2 (-1)^0 × 1.011 × 2^2 (1)0×1.011×22 S = 0 , E = 2 , M = 1.011 S = 0, E = 2, M = 1.011 S=0,E=2,M=1.011
  5. 根据 S E M SEM SEM值获取其对应的二进制形式,如 S = 0 , E = 2 , M = 1.011 S = 0, E = 2, M = 1.011 S=0,E=2,M=1.011对应的二进制形式:
    • S位:值为0,对应的二进制形式为0
    • E位:32位中 2 + 127 = 130 2+127=130 2+127=130,对应的二进制形式为10000010
    • M位:仅存储小数部分011,对应的二进制形式为01100000000000000000000
    • 完整的二进制形式为0 10000010 01100000000000000000000

4.5 浮点数的获取

当我们要将存放在内存中的浮点数给取出来是,我们则需要根据E的取值来进行还原,此时E可能会出现3种情况:

  • E为全0
  • E为全1
  • E既有0也有1

我们在进行存入时,由于E表示的是无符号整型,为了避免出现负值的存入,因此我们需要在存入之前为其值加上一个中间值:

  • 32位的中间值为127
  • 64位的中间值为1023

因此当要进行还原时,我们则需要给E此时存入的值减去一个中间值,这时就需要分情况进行讨论了:

  • 当E为全0时,表示的是一个无限接近于0的无穷小数,因此,还原时使用1 - 中间数
  • 当E为全1时,表示的是一个无限接近于无穷的无穷大数,因此,还原时使用E的最大值 - 中间数
  • 当E既有0也有1时,表示的是一个正常的数,因此还原时直接用E的值 - 中间数

而对于有效数字M而言,正常情况下的存入都是省略整数部分的1,仅存入小数部分,因此我们在还原时需要加上整数部分的1;

但是在E为全0时,表示存入的数是一个无限接近于0的无穷小数,因此在还原时,是不需要加上整数部分的1;

当E为全1时,表示存入的数是一个无限接近于无穷大的数,因此在还原时,我们可以忽略小数部分。

4.6 注意事项

  1. 对于浮点数而言,它在进行存储时由于存储的是有效数字的小数部分,因此容易出现精度丢失的情况;

  2. double类型与long double类型在进行存储时之所以精度要高于float类型,是因为float类型占用4个字节也就是32个比特位,而以double类型为例,double类型占用的是8个字节也就是64个比特位。在进行存储时double类型的有效数字部分能够使用的比特位要远多于float类型的有效数字部分能够使用的比特位,因此double类型与long double类型要比float类型更加的精确。

  3. 由于浮点型的数据在存储时会出现精度丢失的情况,因此我们在对两个浮点数进行比较时,不能直接通过'=='来进行比较,而是可以通过两个浮点数作差来判断差值的精度范围,当差值在指定的精度范围内时,我们则可以认为这两个浮点数的值相等

五、浮点数与整数的相关问题探讨

对于咱们现阶段而言,浮点数的存储我们只需要对上述的知识点有一个简单的了解即可,正常情况下我们不会遇到一些比较奇怪的问题,比如整数与浮点数进行混合运算时结果出现较大偏差的情况。

但是,不怕一万就怕万一,如果哪天我们真的遇到了此类问题,我们应该需要知道问题出在哪里,以及如何解决问题。

接下来我们要探讨的是整型与浮点型数据之间运算的问题。在学习操作符的时候,我们有学习过两种转换方式——隐式类型转换与强制类型转换。接下来我们就来依次探讨两种转换方式

5.1 整数与浮点数之间的隐式类型转换

在隐式类型转换中,不同类型的数值之间的运算遵循一个默认的转换方式:

  • 对于不满4个字节的数据类型char、short而言,它们在与整型进行运算时会进行整型提升
  • 对于字节数大于等于4个字节的数据类型int、unsigned int、long、unsigned long、float、double、long double而言,左侧的数据类型与右侧的数据类型进行混合运算时,左侧的数据类型会通过算术转换成右侧的数据类型。

因此我们在正常的进行整数与浮点数的混合运算时,其数值会通过隐式类型转换先转换成对应的浮点数类型,然后再进行计算,此时会遇到两种情况:

  • 将计算后的值存入整型变量中
  • 将计算后的值存入浮点型变量中

对于这两种不同的情况,会产生什么样的效果呢?接下来我们就来做个简单的测试:

隐式转换
从这次测试结果中我们可以获取到几个信息:

  1. 在进行整型与浮点型的混合运算时,运算的结果为float类型;
  2. 当直接将该值以整型的形式进行输出时,结果会出现错误
  3. 当直接以整型与浮点型的混合运算的形式输出结果时,会出现算术溢出的问题

这组测试很好的说明了一个问题——整型与浮点型进行运算时,整型的数值会隐式转换成浮点型的数值然后再进行计算。

从变量c与变量d的输出来看,直接对这两种类型进行运算时没有任何问题的;但是当我们直接对结果进行输出时,则会出现算术溢出的问题,溢出的原因是整型在运算时由4个字节转换到了8个字节,系统给出的解决方法是在调用+之前将值强制类型转换成8个字节即可,如下所示:

隐式类型转换2

可以看到,当我们在以整型的形式输出时,将变量b强制类型转换成int之后没有出现算术溢出的问题;当我们以浮点型的形式输出时,如果我们将int类型强制转换成float类型之后,还是会存在算术溢出的问题,但是将其转换成double类型之后,则不再存在算术溢出的问题。

这也就是说明在VS中,浮点型的数据进行计算时,会将float类型的数据自动的提升到double之后再进行计算,并且在运算的过程中对数据的强制类型转换不会影响运算结果。

那是不是所有的强制类型转换都不会影响运算结果呢?下面我们先来看一个例子:

强制类型转换
从这个例子中可以看到,当我们正常的在运算过程中进行强制类型转换时,运算结果是不受影响的,但是当我们借助指针进行强制类型转换时,结果却出现了错误。这个是为什么呢?下面我们就来分析一下这个例子;

5.2 强制类型转换

对于一个整数而言,其二进制的形式仅由符号位与数值位组成,当我们通过指针将一个整型强制转换成浮点型时,由于存储形式发生了变化,其所对应的值也会发生变化。

如有符号整型5所对应的二进制形式为

0000 0000 0000 0000 0000 0000 0000 0101

该二进制形式既是整型5的补码,也是整型5的反码与原码,当我们将其强制转换成浮点型时,存储形式则会发生变化,转变成:

0 00000000 00000000000000000000101

此时对应的 S E M SEM SEM的值分别为:

S = 0 S = 0 S=0
E = − 126 E = -126 E=126
M = 0.00000000000000000000101 M = 0.00000000000000000000101 M=0.00000000000000000000101

经过还原后我们得到的值为:
( − 1 ) 0 × 0.00000000000000000000101 × 2 − 126 (-1)^0 × 0.00000000000000000000101 × 2^{-126} (1)0×0.00000000000000000000101×2126
不难发现,此时我们获得的值是一个无限接近于0的无穷小值;

对于一个浮点数而言,其二进制的形式是由 S E M SEM SEM组成,当我们将一个浮点数通过指针强制转换成整数时,与整型转换成浮点型一样,由于存储形式发生了变化,其值也会发生变化。

如浮点数5.0所对应的二进制数为101.0,将其转换成浮点数格式后得到的式子为:
( − 1 ) 0 × 1.010 × 2 2 (-1)^0 × 1.010 × 2^2 (1)0×1.010×22
该式子所对应的 S E M SEM SEM的值分别为: S = 0 S = 0 S=0 E = 2 E = 2 E=2 M = 1.010 M = 1.010 M=1.010
在32位下,将其存入内存时所对应的二进制形式为:

0 10000001 01000000000000000000000

当我们将其强制转换成整型时,由于存储形式发生了改变,其对应的二进制形式则变为:

0100 0000 1010 0000 0000 0000 0000 0000

所对应的整型值则是 2 30 + 2 23 + 2 21 2^{30} + 2^{23} + 2^{21} 230+223+221,可以看到获得的整型值是一个远大于5的值,为了验证我们分析的正确性,接下来我们借助计算机来计算一下该值的大小:

强制类型转换2

可以看到正如我们分析的一样,当我们通过指针来进行浮点数与整数的强制类型转换时,此时会因为数值在内存中的存储形式发生了变化而导致问题的产生。

5.3 小结

下面我们就来对整数与浮点数之间的类型转换做个小结:

  • 当我们在进行浮点数与整数之间的正常运算,不涉及指针时,那么在运算的过程中整型会隐式转换成浮点型然后进行运算,此时我们如果对其值进行强制类型转换是不会影响运算结果的;

  • 当我们进行浮点数与整数之间的混合运算,涉及指针时,那么我们对指针进行强制类型转换,就会导致数据在内存中的存储形式发生变化,从而导致其值在完成转换后也会发生改变;

结语

在今天的内容中我们介绍了整型数据与浮点数据在内存中的存储形式与存储方式:

  • 数据在内存中都是以二进制的形式进行存储
    • 无符号整型数据在存储时,是以数值所对应的二进制形式存储在内存中
    • 有符号整型数据在存储时,是以数值所对应的二进制补码的形式存储在内存中
    • 浮点数在内存中是根据 S E M SEM SEM来进行存储的:
      • 32位中,E在存储时值需要加上127
      • 64位中,E在存储时只需要加上1023
  • 数据在内存中的存储方式有两种:
    • 大端存储:数据的低字节位的值存储在高地址处,高字节位的值存储在低地址处。大端存储的方式会将数据以顺序存储的形式存放在内存中;
    • 小端存储:数据的低字节为的值存储在低地址处,高字节位的值存储在高地址处。小端存储的方式会将数据以逆序存储的形式存储在内存中;

今天的内容到这里就全部结束了,如果大家喜欢博主的内容,可以点赞、收藏加评论支持一下博主,当然也可以将博主的内容转发给你身边需要的朋友。最后感谢各位朋友的支持,咱们下一篇再见!!!

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

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

相关文章

家用设备轻松搭建 AI 集群,畅跑 Llama 3.1 405B

作者:老余捞鱼 原创不易,转载请标明出处及原作者。 写在前面的话: 本文主要介绍如何在家用设备上运行大型开源语言模型Llama 3.1 405B,首先我会解释构建人工智能集群来提高运行效率的原理,随后会演示如何通过Distributed Llama项目支持在多个设备上运行LLM模型,并…

【STL】05.vector的模拟实现

一、vector的实现 1.1 基本框架 template<class T> class vector {typedef T* iterator;typedef const T* const_iterator; public:private:iterator _startnullptr;iterator _finishnullptr;iterator _end_of_storagenullptr; };1.2 vector的默认成员函数 1.2.1 构造…

如何通过大模型生成业务需要的数据集

现在大模型训练数据的主力都是LLM自己贡献的了。但是也不是说你让它输出什么&#xff0c;然后它就一劳永逸地不停地输出你想要的东西。受限于LLM本身的能力、上下文规定的长度、训练方式导致的有限变化&#xff0c;你需要不断变更你的prompt&#xff0c;以让输出更多样。 接下…

录屏为什么没有声音?一款软件为您解决无声难题

录屏已经成为我们日常工作和生活中不可或缺的一部分。然而&#xff0c;有时在录屏过程中&#xff0c;我们可能会遇到一个令人困惑的问题&#xff1a;录屏为什么没有声音&#xff1f;本文将详细解析电脑录屏没有声音的可能原因&#xff0c;并提供相应的解决方案。同时&#xff0…

YOLOv10问世,登顶GiTHub!性能飞升,【多尺度目标检测】值得大看特看!

【多尺度目标检测】是近年来在深度学习领域中备受关注的一项技术&#xff0c;它通过处理图像中不同尺度的目标&#xff0c;显著提升了模型在复杂场景中的检测精度和鲁棒性。多尺度目标检测技术已经在自动驾驶、安防监控和遥感图像分析等多个领域取得了显著成果&#xff0c;其独…

SQL Server Management Studio的使用

之前在 https://blog.csdn.net/fengbingchun/article/details/140961550 介绍了在Windows10上安装SQL Server 2022 Express和SSMS&#xff0c;这里整理下SSMS的简单使用&#xff1a; SQL Server Management Studio(SSMS)是一种集成环境&#xff0c;提供用于配置、监视和管理SQL…

前端工程师学习springboot2.x之配置idea热更新实现高效率开发节奏

目前已经学习springboot实现了增删改查分页查询&#xff0c;每次修改业财或者是代码重启项目都让我觉得很闹心&#xff0c;现在给出idea2021版本自带热更新操作设置&#xff0c;设置过程分享给大家 总结&#xff1a;以上就是配置的全部过程&#xff0c;祝大家写代码快乐…

鸿蒙(Harmony) NEXT - AlphabetIndexer实现联系人字母索引

鸿蒙(Harmony) NEXT 9月份就要正式上架了&#xff0c;并且不会再兼容安卓平台&#xff0c;于是我也赶紧给App开发鸿蒙版本&#xff0c;接下来会写一系列的Harmony开发教程。 今天使用AlphabetIndexer实现联系人字母索引&#xff0c;AlphabetIndexer是官方封装好的组件 咱们实…

【驱动程序】3.5寸SPI液晶屏_ILI9488_stm32f103c8t6_CubeMX_HAL库

【驱动程序】3.5寸SPI液晶屏_ILI9488_stm32f103c8t6_CubeMX_HAL库 主控芯片&#xff1a; stm32f103c8t6 接线&#xff1a; LED-3.3v其他管脚按main.h文件接: #define LCD_CS_Pin GPIO_PIN_1 #define LCD_CS_GPIO_Port GPIOA #define LCD_RS_Pin GPIO_PIN_2…

武汉流星汇聚:全球化与多元化并进,亚马逊展望电商领域无限可能

在全球电商的浩瀚星空中&#xff0c;亚马逊无疑是最为耀眼的一颗星辰。凭借其多年在跨境市场的深耕细作&#xff0c;亚马逊不仅积累了庞大的高活跃用户群&#xff0c;还构建了显著的平台流量优势。根据Similar Web的权威数据&#xff0c;亚马逊的独立访问用户数量已超过26.59亿…

EGO-Swarm 仿真环境搭建

EGO-Swarm仿真环境搭建 参考教程&#xff1a; https://github.com/ZJU-FAST-Lab/ego-planner-swarm EGO-Swarm是一种分散的异步系统解决方案&#xff0c;用于仅使用机载资源在未知的障碍物丰富的场景中进行多机器人自主导航。 1. 查看系统环境 要运行本仿真程序&#xff0c…

评估测量仪器/传感器时的各种精度解析一览

在工业测量中&#xff0c;精度是一个复合概念&#xff0c;涉及到多个方面&#xff0c;通常用来描述测量结果的准确性和可靠性。 在选择测量仪器/传感器时&#xff0c;面对众多的精度名称&#xff0c;你是否苦恼他们具体描述的是什么精度&#xff0c;是否和评估要求有直接关联&…

开放式耳机有什么好处?开放式耳机该怎么选?

​开放式耳机的好处多多呀&#xff01;如今&#xff0c;开放式耳机已经迅速成为耳机市场上的新宠&#xff0c;它们以其独特的佩戴方式和卓越的音质表现&#xff0c;赢得了广大音乐爱好者和运动达人的喜爱。尤其是对于那些热爱听歌和追求运动自由的人们来说&#xff0c;开放式耳…

电脑录屏软件推荐,6款高效录屏神器(2024最全最新)

电脑录屏软件成为了我们工作、学习和娱乐中不可或缺的工具。无论是录制PPT演示、QQ聊天过程&#xff0c;还是进行专业的直播或教学&#xff0c;都需要一款功能强大、操作简便的录屏软件。 那么&#xff0c;本文将为大家进行电脑录屏软件推荐&#xff0c;让您无论在哪种录屏场景…

共享之道——享元模式(Python实现)

共享之道——享元模式&#xff08;Python实现&#xff09; 大家好&#xff0c;今天我们继续来讲结构型设计模式&#xff0c;上一期我们介绍了外观模式&#xff0c;这一期我们来讲享元模式&#xff08;Flyweight Pattern&#xff09;。 享元模式&#xff08;Flyweight Pattern…

超实用 不再担心猫咪掉毛 一文教你养宠家庭空气净化器怎么选

一到夏天&#xff0c;家中的猫咪给你带来的不仅仅是温暖的陪伴&#xff0c;还有那挥之不去的宠物异味。普通空气净化器虽然能够应对一般的空气净化需求&#xff0c;但对于养猫家庭特有的挑战&#xff0c;如宠物毛发、皮屑和异味等&#xff0c;它们往往难以胜任。专业的宠物空气…

【LLM大模型】大模型Prompt Engineering提示词工程

目录&#xff1a; 1、提示工程简介 2、如何写好提示词 2.1 描述清晰2.2 角色扮演2.3 提供示例2.4 复杂任务分解2.5 使用格式符区分语义2.6 情感和物质激励2.7 使用英语2.8 结构化提示词 1、提示工程简介 1.1 什么是Prompt 提示词&#xff1f; 不论是文生图应用&#xff0c;…

STM32-门电路-储存器-寄存器-STM32f1-MCU-GPIO-总线-keil5-点led

1、门电路 门电路组成简单加法器&#xff1a; 二进制对电路的影响&#xff1a; 0和1代表无和有&#xff1b; 以下图例&#xff0c;演示与门&#xff1a;左1右1输出1&#xff1b; 电平标准&#xff1a;使用不同的电压表示数字0和1&#xff1b; 高电平&#xff1a;1&#xff1…

【CSS】文字交融展开

实现如下效果&#xff0c;仅需一个动画几行代码 首先给文本元素添加动画 letter-spacing&#xff1a;初始文本堆在一起&#xff0c;结束展开文本filter&#xff1a;初始模糊&#xff0c;结束清晰 然后给文本的父元素设置对比度&#xff0c;简单理解为亮的更亮暗的更暗。 以…