【ONE·C || 数据存储】

news2024/11/15 10:22:49

总言

  C语言:数据存储相关介绍。

文章目录

  • 总言
  • 1、基本数据类型介绍
    • 1.1、整体介绍
    • 1.2、各数据类型分别说明(整型、浮点型、构造、指针、空)
  • 2、整型在内存中的存储
    • 2.1、原码、反码、补码
      • 2.1.1、总体介绍
      • 2.1.2、char、short类型在内存中的存储范围
    • 2.2、大小端字节序存储
    • 2.3、相关练习
      • 2.3.1、练习一
      • 2.3.2、练习二
      • 2.3.3、练习三
      • 2.3.4、练习四
      • 2.3.5、练习五
      • 2.3.6、练习六
      • 2.3.7、练习七
  • 3、浮点型在内存中的存储
    • 3.1、问题引入
    • 3.2、浮点数存储规则
      • 3.2.1、浮点数的表示形式(一):基本认知
      • 3.2.2、浮点数的表示形式(二):如何将数据放入
      • 3.2.3、浮点数的表示形式(三):如何将数据取出
    • 3.3、3.1中问题说明

  
  

1、基本数据类型介绍

1.1、整体介绍

  我们曾在初识C语言一章中简单介绍过C中内置类型以及它们的存储大小。

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

  不同类型的意义:
  1、 使用这个类型开辟内存空间的大小(大小决定了使用范围)。
  2、 如何看待内存空间的视角。
  
  

1.2、各数据类型分别说明(整型、浮点型、构造、指针、空)

  1)、整型家族

char
	unsigned char
	signed char
	
short
	unsigned short[int]
	signed short[int]
	
int
	unsigned int
	signed int
	
long
	unsigned long[int] //括号表示可以省略int简写
	signed long[int]

  说明:
  1、整数的各个类型分为有符号和无符号。有符号无符号的区别: 最高位为符号位还是数据位。有符号类型最高位为符号为,0表示正数,1表示负数。

  2、char字符类型归类为整型的原因: 字符类型数据存储时的是字符的ASCII码值,ASCII码是整数。

  3、一般情况下,默认整形为有符号整形。由此衍生了英文字母的一些简写。当在无符号类型的变量中存入负数时,会根据一定的规律转化为对应的无符号变量(此处不能单纯的认为打印出的数据为去掉负号后的值)

short == signed short ;
int == signed int ;
long int == signed long int == signed long ;

  4、简写情况下,char类型是有符号还是无符号: C语言并没有对char做明确规定,char默认类型取决于编译器,常见的编译器下为signed char

  5、关于以有符号的%d解读无符号整数错误的原因: 解读补码的视角不同。
在这里插入图片描述

  
  2)、浮点型家族

float 
double

  说明:
  1、flaot 单精度浮点类型,占4个字节double 双精度浮点类型,占8个字节 (32位)
  
  
  3)、构造类型(自定义类型)

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

  说明:
  1、数组的类型是去掉数组名后剩余部分。如下述,为不同类型的两个数组。当数组元素类型、元素个数发生变化,能得到不同类型的数组。

int arr[10];  //arr类型为: int [10]
int arr2[4];  //arr2类型为: int [4]
int arr[ ] = { 0, 0, 0}; //arr类型为:int [3]

  
  
  4)、指针类型

int *pi;
char *pc;
float* pf;
void* pv;

  
  
  5)、空类型(无类型)

void 表示空类型(无类型)
通常应用于函数的返回类型、函数的参数、指针类型。

  应用举例:

int main()//参数为void
{
	return 0;
}
void test(void)
{

}
void* p;

  
  
  
  

2、整型在内存中的存储

2.1、原码、反码、补码

2.1.1、总体介绍

  计算机中的整数有三种表示方法,即原码、反码和补码。三种表示方法均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示“负”。
  
  1)、原码、反码、补码基本介绍

原码: 直接将数据按照正负数的形式翻译成二进制。
反码: 原码的符号位不变,其他位依次按位取反。
补码: 反码+1就得到补码。

  需要注意:
  此处,反码按位取反的含义,其和按位取反运算符~ 的含义不同,后者连带符号位也按位取反。
  
  

  2)、整型数值中正数、负数的原码、反码、补码规则
  1、按照上述1)中描述可知,正数的原、反、补码都相同。负数需要一定转换。
  2、对于整形来说:数据存放内存中其实存放的是补码
  
  
  3)、为什么整型数据在内存中存储的是补码?
在这里插入图片描述
  
  

2.1.2、char、short类型在内存中的存储范围

  char 如下图:
在这里插入图片描述

  short如下图:
在这里插入图片描述

  
  
  

2.2、大小端字节序存储

  1)、是什么

  字节序: 以字节为单位,看其顺序。

  大端字节序存储:数据的低位字节存放在内存的高地址处,高位字节存放在内存的低地址处

  小端字节序存储:数据的低位字节存放在内存的低地址处,高位字节存放在内存的高地址处
  
  
  
  2)、为什么

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

  
  
  3)、相关练习:设计一个小程序来判断当前机器的字节序

  代码1.0:
  写成函数的形式,可以根据其返回值来判断大小端,优点在于得到一个返回值,而是否打印判断结果根据需求决定。

int check_sys()
{
	int a = 1;//0X000001
	char* p = (char*)&a;
	if (1 == *p)
	{
		return 1;//小端
	}
	else
	{
		return 0;//大端
	}
}

int main()
{
	int ret = check_sys();
	if (ret)
	{
		printf("小端存储\n");
	}
	else
	{
		printf("大端存储\n");
	}

	return 0;
}

  代码改进2.0:对上述内容做一定简化

int check_sys()
{
	int a = 1;//0X000001
	char* p = (char*)&a;
	return *p;
}
int check_sys()
{
	int a = 1;//0X000001
	return *((char*)&a);
}

  
  
  
  

2.3、相关练习

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

  分析:
  1、存储时:无论是char,unsigned char,signed char,-1是整型,32位数据被截断,只留最低的八位:1111 1111

 1000 0000   0000 0000   0000 0000    0000 0001(原)
 1111 1111   1111 1111   1111 1111    1111 1110(反)
 1111 1111   1111 1111   1111 1111    1111 1111(补)

  2、%d打印时,将数据取出,要发生整型提升,无符号、有符号正数高位补0,有符号负数高位补1。

对a、b://a要看默认存储类型,此处以默认为有符号char考虑  
	1111 1111 1111 1111 1111 1111 1111 1111(补)
    1111 1111 1111 1111 1111 1111 1111 1110(反)
    1000 0000 0000 0000 0000 0000 0000 0001(原)
对c: 
    0000 0000 0000 0000 0000 0000 1111 1111(无符号原反补码相同)

在这里插入图片描述
  
  
  

2.3.2、练习二

  以下输出结果是什么?

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

  分析:
  1、存储时,-128被截断:1000 0000

1000 0000 0000 0000 0000 0000 1000 0000 ()
1111 1111 1111 1111 1111 1111 0111 1111 ()
1111 1111 1111 1111 1111 1111 1000 0000 ()

  2、%u读取
  ①先发生整型提升,a是signed char,高位补符号位

1111 1111 1111 1111 1111 1111 1000 0000 ()

  ②%u将数据视为无符号读取,故原反补相同,故读到的是一个很大的值。
在这里插入图片描述

  
  
  

2.3.3、练习三

  以下输出结果是什么?

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

  分析:
  1、存储时:128被截断,为1000 0000

0000 0000 0000 0000 0000 0000 1000 0000 (原、反、补相同)

  2、%u打印,和练习二一致。
  ①先发生整型提升,a是signed char,高位补符号位

1111 1111 1111 1111 1111 1111 1000 0000 ()

  ②%u打印,将数据视为无符号读取,故原反补相同,故读到的是一个很大的值。
在这里插入图片描述
  
  
  
  

2.3.4、练习四

  以下输出结果是什么?

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

  分析:
  1、存储时:

对i:-20
	1000 0000 0000 0000 0000 0000 0001 0100 ()
	1111 1111 1111 1111 1111 1111 1110 1011 ()
	1111 1111 1111 1111 1111 1111 1110 1100 ()
对j:10
	0000 0000 0000 0000 0000 0000 0000 1010 (原、反、补相同)

  2、i+j计算时,发生隐式类型转换,将i视作无符号整型:
  算术运算是计算补码。

	1111 1111 1111 1111 1111 1111 1110 1100 (i)
	0000 0000 0000 0000 0000 0000 0000 1010 (j)
	1111 1111 1111 1111 1111 1111 1111 0110 (i+j)

  3、%d,以有符号数打印

	1111 1111 1111 1111 1111 1111 1111 0110 ()
	1111 1111 1111 1111 1111 1111 1111 0101 ()
	1000 0000 0000 0000 0000 0000 0000 1010 ()

在这里插入图片描述

  
  
  
  

2.3.5、练习五

  以下输出结果是什么?

#include <stdio.h>
int main()
{
    unsigned int i;
    for (i = 9; i >= 0; i--)
    {
        printf("%u\n", i);
    }
    return 0;
}

  分析:
  i为无符号型无负数。-1会转换为对应的无符号数,为一个很大的数字。

-11000 0000   0000 0000   0000 0000   0000 0001(原)
1111 1111   1111 1111   1111 1111   1111 1110(反)
1111 1111   1111 1111   1111 1111   1111 1111(补)
无符号下:该串数字为正数,原码、反码、补码相同:4294967295
故循环从987……210、后,变为-1对应的无符号数,为正数,又开始循环。
(或者说无符号下无负数,循环不会终止)

在这里插入图片描述
  
  
  
  

2.3.6、练习六

  以下输出结果是什么?

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

  分析:先理解代码,①char a[1000]定义一个大小为1000的字符数组,②遍历放入数据:-1、-2、-3、-4、……、-1000,③strlen(a)计算该数组大小。
  
  由上述2.1.2,我们可知,signed char类型的数据范围 限制,上述数组中实际存入的是-1、-2、……-128、127、126……0,-1此类循环。
  strlen读取‘\0’前的字符数,‘\0’的ascll码值为0,即读取-1到-128共128个,127到1共127个,总共127+128=255个。
在这里插入图片描述

  
  
  
  

2.3.7、练习七

  以下输出结果是什么?

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

  分析:unsigned char类型,取值范围是0~255,当i超过255时,数值溢出后无符号范围内又回到0重新开始,故陷入无限循环。
  说明:使用无符号类型做循环时需要慎重。
  
  
  
  

3、浮点型在内存中的存储

3.1、问题引入

  1)、常见的浮点数类型
  浮点数家族介绍:

float
double
long double //C99之后才拥有

  浮点数举例:

3.14159 //字面浮点型
1E10 //浮点数的科学记数法形式,E表示底数为10,整体是1.0x1^(10)

  
  
  2)、两个文件:浮点数范围、整型范围

  float.h:定义了浮点数的取值范围的相关信息
  limits.h:定义了整型取值范伟的相关信息
在这里插入图片描述

  
  
  3)、问题引入:相关代码

int main()
{
	int n = 9;//存储一个整型的数9
	float* pFloat = (float*)&n;//将n值取地址并强制转换为浮点型指针
	printf("n的值为:%d\n", n);//以整型数值打印n值
	printf("*pFloat的值为:%f\n", *pFloat);//以浮点型数值打印n值

	*pFloat = 9.0;//存储一个浮点型的数9.0
	printf("num的值为:%d\n", n);//以整型的数值打印n
	printf("*pFloat的值为:%f\n", *pFloat);//以浮点型的数值打印n

	return 0;
}

  演示结果如下:
在这里插入图片描述
  推断:浮点型和整型在内存中存储方式不同。正因此,存入一个整型变量,以%f浮点数的形式打印,该变量在内存中的补码会以浮点数存储的方式解读。同理,存入一个浮点数,以%d整数的形式打印,原先以浮点数方式存储的变量,会被解读为整型的存储形式
  
  
  

3.2、浮点数存储规则

3.2.1、浮点数的表示形式(一):基本认知

  1)、整体说明
   根据国际标准IEEE(电气和电子工程协会) 754,任意一个二进制浮点数V可以表示成下面的形式:

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

  
  2)、小数点后的二进制位
     2 − 1 = 0.5 2^{-1}=0.5 21=0.5
     2 − 2 = 0.25 2^{-2}=0.25 22=0.25
     2 − 3 = 0.125 2^{-3}=0.125 23=0.125
     2 − 4 = 0.0625 2^{-4}=0.0625 24=0.0625
  
  3)、举例说明

  演示例子一: 十进制的浮点数5.5

  step1:
  对于小数点前,将其转换为二进制可得:101
  对于小数点后,将其转换为二进制可得:1
  那么5.5转换为二进制后,得:101.1
  (PS:对于小数点后的二进制转换,不能照虎画猫生搬小数点前的规则,将5.5解读为101.101)

  step2:
  将101.1写为科学计数法,注意是二进制: 1.011 × 2 2 1.011×2^{2} 1.011×22

  step3:
  则由上述规则可得, ( − 1 ) 0 × 1.011 × 2 2 (-1)^0×1.011×2^{2} (1)0×1.011×22
   S = 0 S=0 S=0 M = 1.011 M=1.011 M=1.011 E = 2 E=2 E=2

  
  演示例子二: 十进制的浮点数9.0

  step1: 9.0转换为二进制得,1001.0
  step2: 写成科学计数法得, 1.001 × 2 3 1.001×2^{3} 1.001×23
  step3: 是正数,故最终结果为, ( − 1 ) 0 × 1.001 × 2 3 (-1)^{0}×1.001×2^{3} (1)0×1.001×23
      故 S = 0 S=0 S=0 M = 1.001 M=1.001 M=1.001 E = 3 E=3 E=3.
  
  
  

3.2.2、浮点数的表示形式(二):如何将数据放入

  1)、对32、64存储
   IEEE 754规定:
   对于32位的浮点数,最高的==1位是符号位s,接着的8位是指数E,剩下的23位为有效数字M。
在这里插入图片描述

   对于64位的浮点数,最高的1位是符号位S,接着的11位是指数E,剩下的52位为有效数字M。
在这里插入图片描述
  
  
  2)、对M
   1 ≤ M < 2 1≤M<2 1M<2 ,也就是说, M M M可以写成 1.xxxxxx的形式,其中xxxxxx表示小数部分。IEEE 754规定,在计算机内部保存 M M M,默认这个数的第一位总是1,因此可以被舍去,只保存后面的xxxxxx部分。
  
  比如保存 1.01 1.01 1.01的时候,只保存01,等到读取的时候,再把第一位的1加上去。这样做的目的,是节省一位有效数字。
  例如,32位浮点数,留给 M M M只有23位,将第一位的1舍去以后,等于可以保存24位有效数字。相当于提高精度
  
  
  
  3)、对E
  step1:
  需要明确, E E E为一个无符号整数(unsigned int)。意味着:

E为8:取值范围为0~255
E为11:取值范围为0~2047

  但是,科学计数法中的E是可以出现负数的
  例如 0.5 0.5 0.5二进制为 0.1 0.1 0.1,即 1.0 × 2 − 1 1.0×2^{-1} 1.0×21,其中 E = 1 E =1 E=1,不符合E为无符号数的需求。

  所以IEEE 754规定,存入内存时E的真实值必须再加上一个中间数

对于8位的E:中间数是127
对于11位的E:这个中间数是1023

  比如 2 10 2^{10} 210 E E E 10 10 10,所以保存成32位浮点数时,必须保存成 10 + 127 = 137 10+127=137 10+127=137,即10001001

  
  
  
  4)、举例一:

float f = 5.5

  根据之前分析可知,其二进制为: 101.1 101.1 101.1,转换后得: ( − 1 ) 0 × 1.011 × 2 2 (-1)^{0}×1.011×2^{2} (1)0×1.011×22
  32位下, S = 0 S=0 S=0 M = 1.001 M=1.001 M=1.001 E = 2 + 127 = 129 E=2+127=129 E=2+127=129,二进制是10000001 ,故有:

00000000000000000000000000000000//32位
1位符号位:0
8位E值:1000 0001
23位M值:011 0000 0000 0000 0000 0000 //不够的后面添0
结果得:
01000000101100000000000000000000
0100 0000 1011 0000 0000 0000 0000 0000 -0X40b00000

在这里插入图片描述

  
  
  
  4)、举例二:

float f = -0.5

  根据分析可知,其二进制为: 0.1 0.1 0.1,转换后得: ( − 1 ) 1 × 1.0 × 2 − 1 (-1)^{1}×1.0×2^{-1} (1)1×1.0×21
  32位下, S = 1 S=1 S=1 M = 1.0 M=1.0 M=1.0 E = − 1 + 127 = 126 E=-1+127=126 E=1+127=126,二进制是01111110 ,故有:

00000000000000000000000000000000//32位
1位符号位:1
8位E值:0111 1110
23位M值:000 0000 0000 0000 0000 0000 //不够的后面添0
结果得:
10111111000000000000000000000000
1011 1111 0000 0000 0000 0000 0000 0000 -0Xbf00000

在这里插入图片描述

  
  

3.2.3、浮点数的表示形式(三):如何将数据取出

   取出的情况和存入相反,只是对于E的处理需要分情况讨论:
  
   情形一:E不全为0或不全为1
   对于指数E:内存空间中取出的 计算值-127(或1023),得到真实值。
   对于M:内存空间中取出的有效数字M前加上第一位的1
  
   E全为0
   对于E:指数E = 1-127 =126(或1-1023 =1022)即为真实值。
   对于M:有效数字M不再加上第一位的1,而是还原为0.xxxxxx的小数。这样做是为了表示±0,以及接近于0的很小的数字。
   例如: ± 0. a a a a × 2 − 126 ≈ 0 ±0.aaaa×2^{-126}≈0 ±0.aaaa×21260 ± 0. a a a a × 2 − 1022 ≈ 0 ±0.aaaa×2^{-1022}≈0 ±0.aaaa×210220
  
   E全为1
   如果有效数字M全为0,表示±无穷大(正负取决于符号位s)
  
  
  
  
  

3.3、3.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;
}

   分析:
   int n = 9;

0000 0000 0000 0000 0000 0000 0000 1001(原反补同)

   以%d的形式打印,理解起来并无问题。
   以%f的形式打印,那么视上述这串二进制读取到的为浮点数。32位平台下,1bit为S,8bit为E,23bit为M,则有:

S = 0
E = 0000 00000,E=1-127=-126;
M = 0000 0000 0000 0000 1001 ,不加小数点前1,M=0.0000 0000 0000 0000 1001

   则有: ( − 1 ) 0 × 0.00000000000000001001 × 2 − 126 ≈ 0.0 (-1)^{0}×0.0000 0000 0000 0000 1001×2^{-126} ≈0.0 (1)0×0.00000000000000001001×21260.0
  
   *pFloat = 9.0;,将9.0以浮点数的形式放入内存空间中:
   9.0 9.0 9.0转换为二进制: 1001.0 1001.0 1001.0 ,即 ( − 1 ) 0 × 1.001 × 2 3 (-1)^{0}×1.001×2^{3} (1)0×1.001×23

S = 0
E = 3 + 127 = 130 ,8bit, 1000 0010
M = 1.001,去除第一位1得,01123位,不够后面补0011 0000 0000 0000 0000 0000
故内存中为:
0 1000 0010 011 0000 0000 0000 0000 0000
0100 0001 0011 0000 0000 0000 0000 0000 

   以%d的形式打印,视为无符号整型,正数,原、反、补相同

0100 0001 0011 0000 0000 0000 0000 0000 //0X41300000

   十进制下读取即为:1093664768
  
  
  
  
  
  

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

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

相关文章

顺序表的具体使用方法.数据解构(二)

前言 提示&#xff1a;文本为数据解构(一)后续补充文&#xff1a; 本文具体讲解顺序表的具体使用方法 提示&#xff1a;以下是本篇文 系列文章目录 第一章 数据解构(一) 文章目录 前言 系列文章目录 一、静态的使用方式 二、动态的使用方式 1.定义一个结构体 2.初始化 3.扩容…

【ArcGIS微课1000例】0060:ArcGIS打开las格式点云数据的方法

文章目录 1. 使用上下文菜单创建 LAS 数据集2. 使用地理处理工具创建 LAS 数据集3. 显示LAS数据集LAS 数据集是位于文件夹中的独立文件,并且引用 LAS 格式的激光雷达数据和用于定义表面特征的可选表面约束要素。ArcGIS中,可使用创建 LAS 数据集工具或 ArcCatalog 中文件夹的上…

23种设计模式(二十)——责任链模式【数据结构】

文章目录 意图什么时候使用责任链真实世界类比责任链模式的实现责任链模式的优缺点亦称:职责链模式、命令链、CoR、Chain of Command、Chain of Responsibility 意图 将链中的每一个节点看作是一个对象,每个节点处理的请求不同,且内部自动维护一个下一节点对象。当一个请求…

【OpenGL学习】camera and camera control

摄像机 游戏中的相机可以理解为与现实中的相机类似&#xff0c;可以捕获对应的游戏画面。Camera在游戏引擎中一般也会展示为现实中相机的模型&#xff0c;使用时有两种实现方式&#xff0c;一种以组件形式挂载在Character上&#xff0c;一种则是单独存在。通常来讲&#xff0c…

Flutter 基础-下

一、shared_preferences shared_preferences 是一个本地数据缓存库&#xff08;类似 AsyncStorage&#xff09; https://pub.dev/packages/shared_preferences 使用步骤 在 pubsepc.yaml 中添加 shared_preferences 依赖安装依赖&#xff08;pub get | flutter packages get |…

Git使用Merge和Rebase区别及心得技巧

git rebase命令常常因为江湖上关于它是一种Git魔法命令的名声而导致Git新手对它敬而远之&#xff0c;但是事实上如果一个团队能够正确使用的话&#xff0c;它确实可以让生活变得更简单。在这篇文章中我们会比较git rebase和经常与之相提并论的git merge命令&#xff0c;并且在真…

【回望2022,走向2023】一个双非二本非科班的学生的旅途

目录 1.自我介绍 2.高考与暑假 梦想 幻灭 决心 暑假 3.大一上学期 4.奋进之路 5.展望未来 1.自我介绍 我是一个双非本科的大一学生&#xff0c;在2023年的新春之际&#xff0c;借着CSDN的这次年度总结活动&#xff0c;来好好回顾一下&#xff0c;2022这个平凡却又不乏…

css 2D转换

文章目录一、什么是2D转换二、rotate() 方法&#xff08;旋转&#xff09;三、translate() 方法&#xff08;位移&#xff09;四、scale() 方法&#xff08;缩放&#xff09;五、skew() 方法 &#xff08;倾斜&#xff09;一、什么是2D转换 在二维空间下对元素进行移动、缩放、…

面试官问我有没有分布式系统开发经验,我一脸懵圈…

目录 从单块系统说起团队越来越大&#xff0c;业务越来越复杂分布式出现&#xff1a;庞大系统分而治之分布式系统所带来的技术问题一句话总结&#xff1a;什么是分布式系统设计和开发经验补充说明&#xff1a;中间件系统及大数据系统 前言 现在有很多Java技术方向的同学在找工…

深度学习网络---YOLO系列

深度学习网络—YOLO yolov1&#xff08;仅适用一个卷积神经网络端到端地实现检测物体的目的&#xff09; 首先将输入图片resize到448448&#xff0c;然后送入CNN网络&#xff0c;最后处理预测的结果得到检测的目标&#xff1b;yolov1的具体思想是将全图划分为SS的格子&#xf…

结构型模式-外观模式

1.概述 有些人可能炒过股票&#xff0c;但其实大部分人都不太懂&#xff0c;这种没有足够了解证券知识的情况下做股票是很容易亏钱的&#xff0c;刚开始炒股肯定都会想&#xff0c;如果有个懂行的帮帮手就好&#xff0c;其实基金就是个好帮手&#xff0c;支付宝里就有许多的基…

智能的本质不是数据算法算力和知识

编者按&#xff1a;人机之间未解决的大部分问题不是统计问题&#xff0c;而是统计概率分布外的问题。人是自然的&#xff0c;又不是自然的&#xff0c;还是社会的&#xff0c;人类和机器都可以作为认知的载体&#xff0c;但认知的性质是不同的&#xff0c;一个是生命的认知&…

GA6-BGSM/GPRS模块介绍

GA6-BGSM/GPRS模块简介GA6-B是一个4频的GSM/GPRS模块&#xff0c;工作的频段为&#xff1a;EGSM 900MHz、 GSM850MHz和DCS1800, PCS1900。GA6-B支持GPRS multi-slot class 10/ class 8&#xff08;可选&#xff09;和 GPRS 编码格式CS-1, CS-2, CS-3 and CS-4。模块的尺寸只有2…

SelectPdf for .NET 22.0 Crack

SelectPdf for .NET 是一个专业的 PDF 库&#xff0c;可用于创建、编写、编辑、处理和读取 PDF 文件&#xff0c;而无需在 .NET 应用程序中使用任何外部依赖项。使用此 .NET PDF 库&#xff0c;您可以实现丰富的功能&#xff0c;从头开始创建 PDF 文件或完全通过 C#/VB.NET 处理…

python数据结构——栈、队列

python数据结构——栈、队列、树和算法栈栈的操作队列单端队列操作双端队列操作链表或者顺序表的使用场景&#xff1a; 当数据需要后进先出&#xff0c;来构建栈或者先进先出&#xff0c;构建队列时 栈或者队列之内的数据可以以顺序表或者链表的方式进行存储 python内置的数据…

Python基础学习 -- 模块与包

1、模块每一个py文件都可以理解为一个模块&#xff0c;模块可以增加项目的可读性2、新建一个名为算数.py文件&#xff0c;代码内容如下&#xff1a;print("算数模块被加载&#xff01;") def 加法(a,b):print(ab)3、新建一个main.py文件&#xff0c;调用模块的内容第…

Vue TypeScript 使用eval函数的坑

正常情况下&#xff0c;项目里不会用eval函数&#xff0c;但是万一要调用一个全局的js库&#xff0c;就需要用eval做些骚操作&#xff0c;这个时候编译会提示&#xff1a; is strongly discouraged as it poses security risks and may cause issues with minification. 警告是…

Java多线程(二)——ReentrantLock源码解析(补充1——从AQS中唤醒的线程)

ReentrantLock源码解析&#xff08;补充1&#xff09; 上一章仅介绍了 ReentrantLock 的常用方法以及公平锁、非公平锁的实现。这里对上一章做一些补充。主要是&#xff1a; AQS 中阻塞的线程被唤醒后的执行流程 &#xff08;本篇讲述&#xff09; 可打断的锁 lock.lockInter…

【QT5.9】与MFC对比学习笔记-感悟篇2【2023.01.23】

是对QT的分析&#xff0c;不仅局限于QT。 二者区别 天下文章一大抄&#xff0c;技术也一样。MFC是对Windows系统API进行的封装&#xff0c;是以视类与文档类为核心的框架设计。微软20年前就已经把MVC玩的很6了&#xff0c;还有控件、动态库等等技术都是微软爸爸先搞出来的。若…

Kubernetes:认识 K8s开源 Web/桌面 客户端工具 Headlamp

写在前面 分享一个 k8s 客户端开源项目 Headlamp 给小伙伴博文内容涉及&#xff1a; Headlamp 桌面/集群 Web 端安装启动导入集群简单查看集群信息 理解不足小伙伴帮忙指正 我所渴求的&#xff0c;無非是將心中脫穎語出的本性付諸生活&#xff0c;為何竟如此艱難呢 ------赫尔曼…