大小端字节序和字节序的判断+有符号整形和无符号整形的取值范围

 

大小端存在的意义

大小端字节存储方式(Big-Endian 和 Little-Endian)的存在主要是由于不同计算机体系结构和网络通信标准对数据表示方式的差异所导致的。大小端字节存储方式的存在具有以下意义:
1. 兼容性:不同的计算机系统和网络协议可能采用不同的字节顺序。大小端字节存储方式允许不同系统之间的数据交换和通信,只要各方都遵守相同的字节顺序约定。
2. 性能:在某些计算机体系结构中,例如x86架构,小端字节存储方式有助于优化性能,因为处理器通常从最低地址开始访问数据,这与小端字节顺序相匹配。
3. 历史原因:早期的一些计算机系统(如IBM的System/360系列)采用了大端字节存储方式,而其他系统(如 Motorola 68000系列)则采用了小端字节存储方式。这些早期的设计选择在后来的技术发展中继续被一些新的系统采用。
4. 可移植代码:在编写可移植的代码时,程序员需要考虑字节顺序的问题,并可能需要使用字节交换或掩码操作来确保代码在不同的系统上都能正确运行。
5. 数据交换:在网络通信和数据交换中,大小端字节顺序的正确处理确保了数据的正确解释。例如,TCP/IP协议栈中的数据包需要按照网络字节顺序(Big-Endian)来处理。
6. 架构设计:计算机体系结构的设计者可以根据系统内部的数据处理方式来选择合适的字节顺序,以便于实现高效的数据访问和处理。
总之,大小端字节存储方式的存在是为了适应不同的系统设计、通信协议和性能需求。正确处理字节顺序对于确保数据的一致性和正确性至关重要。———————————————————————————————————————————

什么是大小端

大小端(Big-Endian 和 Little-Endian)是指计算机系统中多字节数据类型的存储顺序。这种存储方式影响数据的读取和写入,特别是对于有符号整数和浮点数的字节顺序。
1. 大端
   - 在大端字节存储方式中,数据的高位字节(Most Significant Byte,MSB)存储在内存的低地址端,而低位字节(Least Significant Byte,LSB)存储在内存的高地址端。
   - 例如,对于一个四个字节的整数305419896(二进制为00110000 00001010 00001001 00001000),在Big-Endian系统中,它会被存储为:0011 0000 0000 1010 0000 1001 0000 1000。
2. 小端
   - 在小端字节存储方式中,数据的低位字节(LSB)存储在内存的低地址端,而高位字节(MSB)存储在内存的高地址端。
   - 继续上面的例子,在Little-Endian系统中,整数305419896会被存储为:0000 1000 0000 1001 0000 1010 0000 1000。
字节顺序对于二进制数据的处理非常重要,特别是在涉及到网络传输和不同计算机体系结构之间的数据交换时。网络传输通常遵循Big-Endian字节顺序,而某些计算机体系结构(如x86架构)使用的是Little-Endian字节顺序。
程序员在处理跨平台或跨网络的数据时,需要考虑字节顺序的差异,并可能需要进行相应的转换。在编程语言中,有一些函数库或方法可以帮助开发者处理字节顺序的转换。例如,在C语言中,可以使用`memcpy`函数来复制内存块,而`htons`、`htonl`、`ntohs`和`ntohl`函数用于网络字节顺序与主机字节顺序之间的转换。———————————————————————————————————————————

简单的说就是

什么是⼤⼩端?

其实超过⼀个字节的数据在内存中存储的时候,就有存储顺序的问题,按照不同的存储顺序,我们分为⼤端字节序存储和⼩端字节序存储,下⾯是具体的概念:

⼤端(存储)模式:是指数据的低位字节内容保存在内存的⾼地址处,⽽数据的⾼位字节内容,保存在内存的低地址处。

⼩端(存储)模式:是指数据的低位字节内容保存在内存的低地址处,⽽数据的⾼位字节内容,保存在内存的⾼地址处。上述概念需要记住,⽅便分辨⼤⼩端。———————————————————————————————————————————

具体举例

小端存储 在内存里面的存储是倒过来的

那么大端的存储在内存里面是按照顺序进行存储的

也就是顺着存储也就是大端存储,逆着存就是小端存储

———————————————————————————————————————————

图解

首先我们知道 在计算机的存储里面

如果你给一个类型是int类型,那么这个是四个字节

这四个字节是按照大小端进行存储的,

这里如果我们给一个数值1

存放在数值里面那么

如果是小端存储 此时在监视内存里面可以看到四个字节的排序方式是 01 00 00 00 (逆着存储)

如果是大端存储 此时在监视内存里面可以看到四个字节的排序方式是 00 00 00 01(顺序存储)

如果我们按照逻辑进行推论  那么 

首先 我们是知道的是

地址是从低地址到高地址累计的

字节的高位和低位

是从右到左 依次是个十百千万 

所以我们得知 123里面 ,1是个位也就是低位,3是百位也就是高位 

同理我们上述图推理出来

小端字节序存储:低位字节放到低地址处,高位字节放到高地址处。

大端字节序存储:高位字节放在低地址处,低位字节放到高地址处。 

小端字节序(Little-Endian)和大端字节序(Big-Endian)是两种不同的字节存储顺序方式,它们在多字节数据类型(如整数、浮点数等)的存储上存在差异:
- **小端字节序(Little-Endian)**:在小端字节序中,数值的最低位字节被存储在最低的地址中,而最高位字节被存储在最高的地址中。换句话说,数据的高位字节到低位字节是按照地址从低到高进行存储的。这种存储方式在现代计算机体系结构中较为常见,包括x86、ARM等处理器。
- **大端字节序(Big-Endian)**:在大端字节序中,数值的最高位字节被存储在最低的地址中,而最低位字节被存储在最高的地址中。这意味着数据的高位字节到低位字节是按照地址从高到低进行存储的。这种存储方式在一些早期的计算机系统中较为常见,例如IBM的System/360。
在网络通信中,通常使用大端字节序来保证数据的统一性和可交换性。例如,IP地址、端口号、网络字节顺序(如UTF-8编码的字符串)等都是使用大端字节序进行存储和传输的。
在编程中,操作系统和编译器通常会处理字节序的问题,但在跨平台编程或网络编程中,程序员可能需要手动进行字节序的转换,以确保数据在不同系统或网络之间正确地传输和解读。

———————————————————————————————————————————

为什么会有⼤⼩端模式之分呢?以及大小端会怎么出现。

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

例如:⼀个 16bit 的 short 型 x ,在内存中的地址为 0x0010 , x 的值为 0x1122 ,那么0x11 为⾼字节, 0x22 为低字节。对于⼤端模式,就将 0x11 放在低地址中,即 0x0010 中,0x22 放在⾼地址中,即 0x0011 中。⼩端模式,刚好相反。我们常⽤的 X86 结构是⼩端模式,⽽KEIL C51 则为⼤端模式。很多的ARM,DSP都为⼩端模式。

有些ARM处理器还可以由硬件来选择是⼤端模式还是⼩端模式。

也就是一般情况下 x86也就是小端模式

⽽KEIL C51 则为⼤端模式

———————————————————————————————————————————

大小端的练习1

练习1 设计一个小程序 判断大小端

这里必须拿到a的地址 然后向后四个字节 直接只是强制类型是不行的

或者

简化

强制类型转化是先按出来 然后拿出最后一个字节

n的地址取出来是int*

但是我想访问一个字节不是四个字节

所以强制类型转化 指向第一个字节

这里补充一下 如果强制类型转化的时候 直接进行强制类型转化 长字节转化为短字节 此时也就是只取最后一个

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//判断大小端
int main()
{int a = 1;//首先这里给出一个数值//这里需要进行强制类型转化  为什么呢 // 因为这里给出的是一个整形 内存的存储是一个字节 一个字节进行存储的 也就是 //大端:00 00 00 01//小端:01 00 00 00//此时我们不知道这个编译器是大端 还是小端 所以 此时需要我们进行判断//假设是小端 此时我们取地址取出的是整个int类型的 首元素的地址 不是单独指向 四个字节大小的其中一个字节//所以我们需要进行强制类型转化 强制转化为 一个字节的类型 //同时因为这里是取地址 需要用指针进行接收 //所以我们强制类型转化为char*类型//同时他是一个指针 取出a的地址 是一个指针 从而判断第一个字节是00 还是01 从而判断是不是大小端if (*(char*)&a == 1){printf("小端");}else{printf("大端");}return 0;
}

———————————————————————————————————————————

大小端的练习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;
}

代码的讲解

首先我们需要知道 

整形在内存的存储是补码储存,原码进行计算,补码进行存储

正数原码反码补码是一样的

负数的原码需要取反+1

所以也就是

这里计算是需要补满32位的 因为int类型是4个字节 也就是32比特位
在进行转化之后 因为是char类型的 所以需要进行整形截断
然后 打印的时候再进行整形提升 char a= -1;
进行计算
//因为是负数 所以首位是1
//10000000 00000000 00000000 00000001这里是补码 但是我们计算需要进行原码进行计算 所以
//11111111 11111111 11111111 11111110这里是反码 反码就是除了符号位 其他都是按位取反
//11111111 11111111 11111111 11111111这里计算出原码 反码+1 也就是原码
//11111111 最后因为是char类型的 产生截断 只保留 一个字节 也就是八个比特位
//最后打印的时候要进行整形提升 因为是打印的是整数 所以按照符号位进行整形提升
//所以也就是
//11111111 11111111 11111111 11111111signed char b=-1;
//这里是有符号整形
//所以这里是计算方式是一样是 也就是
//因为是负数 所以首位是1
//10000000 00000000 00000000 00000001这里是补码 但是我们计算需要进行原码进行计算 所以
//11111111 11111111 11111111 11111110这里是反码 反码就是除了符号位 其他都是按位取反
//11111111 11111111 11111111 11111111这里计算出原码 反码+1 也就是原码
//11111111 最后因为是char类型的 产生截断 只保留 一个字节 也就是八个比特位
//最后打印的时候要进行整形提升 因为是打印的是整数 所以按照符号位进行整形提升
//所以也就是
//11111111 11111111 11111111 11111111unsigned char c=-1;
//这个是无符号整形
//无符号整形的计算方式很有意思
//无符号整数的计算方式前面换算的时候是按照负数进行换算的 也就是
//10000000 00000000 00000000 00000001原码
//11111111 11111111 11111111 11111110反码
//11111111 11111111 11111111 11111111补码
//11111111截断
//此时有意思的来了
//因为的无符号整形 所以整形提升的时候 他补的符号位是0
//也就是
//00000000 00000000 00000000 11111111
//所以也就是255的数值
//也就是说
// c 的二进制表示(补码)为 11111111(最高位为 1,但是因为是无符号类型,不进行符号位的判断)
// 当打印 c 时,直接打印出其数值,即 255

关于大小端的问题 需要知道 大小端本质是计算机是一种存储方式

拿出来使用的时候也就没有大小端的问题

让你看的时候才有大小端的问题

不理解整形提升的 可以看一下这个博客

整形提升和算数转换-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/Jason_from_China/article/details/135875481

———————————————————————————————————————————

大小端的练习2 知识点的补充 

 有符号整形和和无符号整形的取值区间

这里是画图是有符号整形和无符号整形的取值范围

在 C 语言中,整数类型分为有符号整数和无符号整数,它们的取值范围如下:
有符号整数:
- `signed char`:取值范围是从 -128 到 127。
- `short`:取值范围是从 -32768 到 32767。
- `int`:取值范围是从 -2147483648 到 2147483647。
- `long`:取值范围取决于编译器的实现,通常是 -2147483648 到 2147483647 或者更大。
- `long long`:取值范围是从 -9223372036854775808 到 9223372036854775807。
无符号整数:
- `unsigned char`:取值范围是从 0 到 255。
- `unsigned short`:取值范围是从 0 到 65535。
- `unsigned int`:取值范围是从 0 到 4294967295。
- `unsigned long`:取值范围取决于编译器的实现,通常是 0 到 4294967295 或者更大。
- `unsigned long long`:取值范围是从 0 到 18446744073709551615。
需要注意的是,这些取值范围是在标准状况下,具体实现的取值范围可能会因为编译器的不同而有所差异。此外,`int` 类型通常会被推广(promoted)到 `long` 类型,而 `long` 类型会被推广到 `long long` 类型,当进行这些类型转换时,取值范围也会相应改变。

有符号整形的图解

 

这里只能存放127 128放不下 所以 直接让10000000固定为-128

所以有符号整形的取值范围是取值是-128--127

———————————————————————————————————————————

无符号整形的图解

无符号char类型举例

对于无符号 没有正负之分

所以这里的取值范围是0-255

 

整形提升的补充

1的补码是全11111111111111111111111111111111

整形打印不满足32位 要进行整形提升 

———————————————————————————————————————————

大小端的练习3

 代码 

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

代码解析

#include <stdio.h>
int main()
{char a = -128;
//10000000 00000000 00000000 10000000补码
//11111111 11111111 11111111 01111111反码
//11111111 11111111 11111111 10000000补码
//10000000截断
//%u无符号打印 a是char类型 因为发生截断 所以先进行整形提升
//按照符号位进行整形提升 也就是
//11111111 11111111 11111111 10000000打印
//但是 
//%u无符号打印 
//所以 打印的时候 还是会不打印正负号
//所以结果他也就是 很大的数字 4294967168
//printf("%u\n",a);return 0;
}

———————————————————————————————————————————

大小端的练习4

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

代码解释

#include <stdio.h>
int main()
{char a = 128;
//00000000 00000000 00000000 10000000补码
//00000000 00000000 00000000 10000000反码
//00000000 00000000 00000000 10000000补码
//10000000截断
//%u无符号打印 a是char类型 因为发生截断 所以先进行整形提升
//按照符号位进行整形提升 也就是
//11111111 11111111 11111111 10000000整形提升 按照符号位进行提升
//但是 
//%u无符号打印 
//所以 打印的时候 还是会不打印正负号
//所以结果他也就是 很大的数字 4294967168
//printf("%u\n",a);return 0;
}

———————————————————————————————————————————

大小端的练习5

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

代码的讲解

首先我们需要知道这里是char类型 而且是有符号类型的

也就char类型占据一个比特位 

他的最大值也就是11111111

他的最小值也就是00000000

所以 我们画个图可以理解为

对于代码的图解

 所以结果是255

同理我们也可以知道 

既然我们可以推算出有符号char类型的最大值是-127~127 

那么我们也可以推算出其他类型的大小

也就是说明,计算机里面 类型的大小是有边界的

不同的类型的大小是不一样的

char: 标准规定 char 类型至少为8位(1字节),可以是有符号或无符号的。
有符号 char 的取值范围是从 -128 到 127,
无符号 char 的取值范围是从 0 到 255。
11111111
10000000-01111111short: 标准规定 short int 类型至少为16位(2字节),可以是有符号或无符号的。
有符号 short 的取值范围是从 -32768 到 32767,
无符号 short 的取值范围是从 0 到 65535。
11111111 11111111-0
10000000 00000000-01111111 1111111int: 标准规定 int 类型至少为16位(2字节),但通常在32位系统上使用32位(4字节)。
有符号 int 的取值范围是从 -2147483648 到 2147483647,
符号 int 的取值范围是从 0 到 4294967295。
11111111 11111111 11111111 11111111-0
10000000 00000000 00000000 00000000-01111111 11111111 11111111 11111111int: 标准规定 int 类型至少为16位(2字节),但通常在32位系统上使用32位(4字节)。有符号 int 的取值范围是从 -2147483648 到 2147483647,无符号 int 的取值范围是从 0 到 4294967295。但是要注意的是,32位系统上的 int 通常是这样表示的:
11111111 11111111 11111111 11111111 - 0
10000000 00000000 00000000 00000000 - 0

代码的总结

#include <stdio.h>
int main()
{char a[1000];
//首先我们知道 这里是char字节 也就是 01111111-10000000 这也就是取值区间
//但是我们需要知道的是 这里打印的方式是无符号打印的方式 
//需要知道的是 就算是无符号整形打印 本质这里面还是按照-127~128进行计算的
//计算和打印是区分开的int i;for(i=0; i<1000; i++){a[i] = -1-i;
//这里进行循环的计算 也就是-1,-2,-3,-4,-5.......-127,....128.....-2.进行循环 直到循环结束}
//关键点在这里 这里strlen计算的是'\0'之前的字符的个数 这里也就是一直进行循环也就是 -127~128
//所以也就是255printf("%zd",strlen(a));
//zd的打印整形return 0;
}

———————————————————————————————————————————

大小端的练习6

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

代码的解析

#include <stdio.h>
//首先 根据上面的讲解 我们知道 有符号整形的取值范围和无符号整形的取值范围
//很显然 这里是无符号整形 取值范围是0~255 
unsigned char i = 0;
int main()
{
//接下来我们看这个循环 这个循环一直是小于地等于255的 
//什么意思呢 也就是 这个循环条件一直满足 所以导致不停打印 导致死循环for(i = 0;i<=255;i++){printf("hello world\n");}return 0;
}

 当数值等于255的时候还是小于等于255 继续开始新的循环

所以这个代码是死循环代码 是错误代码 

———————————————————————————————————————————

大小端的练习7

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

代码的解析

#include <stdio.h>
int main()
{unsigned int i;
//首先 这里是无符号整形 
//所以计算的范围是大于0 的//加下来我们看看循环条件 
//这个循环条件是 只要大于0 就会一直进行 循环 所以一直满足条件 导致死循环for(i = 9; i >= 0; i--){printf("%u\n",i);}return 0;
}

同理也是死循环

———————————————————————————————————————————

大小端的练习8

#include <stdio.h>
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;
}

图解

指针+1 是取决于整形类型

整形+1 就是+1

这里是强制类型转化为整形也就是+1

再次强制转化为int* 四个字节也就是此时变成这样

所以指向的是这四个字节

这四个字节按照小端内存的方式存储

低位放在低地址,高位放在高地址

所以结果就是 0x4,0x2000000

代码的解析

#include <stdio.h>
int main()
{
//这里是一个整形数组 1 2 3 4int a[4] = { 1, 2, 3, 4 };//这里是一个指针首先是取地址 整个数组的地址 +1 并且强制转化为整形指针 所以指向的是最后一个地址+1 
int *ptr1 = (int *)(&a + 1);//这里是整形进行+1 并且强制转化为整形指针 也就是指向的是2
//指针+1  是取决于整形类型
//整形+1  就是+1
int *ptr2 = (int *)((int)a + 1);//这里第一个 ptr1[-1]等价于*(ptr-1) 所以指向的从 最后一个地址+1 变成最后一个地址 也就是4
//第二个打印的是2 上面已经解释printf("%x,%x", ptr1[-1], *ptr2);return 0;
}

所以结果是

————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————

 有符号整形和和无符号整形的取值区间和计算 

这里是画图是有符号整形和无符号整形的取值范围

在 C 语言中,整数类型分为有符号整数和无符号整数,它们的取值范围如下:
有符号整数:
- `signed char`:取值范围是从 -128 到 127。
- `short`:取值范围是从 -32768 到 32767。
- `int`:取值范围是从 -2147483648 到 2147483647。
- `long`:取值范围取决于编译器的实现,通常是 -2147483648 到 2147483647 或者更大。
- `long long`:取值范围是从 -9223372036854775808 到 9223372036854775807。
无符号整数:
- `unsigned char`:取值范围是从 0 到 255。
- `unsigned short`:取值范围是从 0 到 65535。
- `unsigned int`:取值范围是从 0 到 4294967295。
- `unsigned long`:取值范围取决于编译器的实现,通常是 0 到 4294967295 或者更大。
- `unsigned long long`:取值范围是从 0 到 18446744073709551615。
需要注意的是,这些取值范围是在标准状况下,具体实现的取值范围可能会因为编译器的不同而有所差异。此外,`int` 类型通常会被推广(promoted)到 `long` 类型,而 `long` 类型会被推广到 `long long` 类型,当进行这些类型转换时,取值范围也会相应改变。

有符号整形的图解

 

这里只能存放127 128放不下 所以 直接让10000000固定为-128

所以有符号整形的取值范围是取值是-128--127

———————————————————————————————————————————

无符号整形的图解

无符号char类型举例

对于无符号 没有正负之分

所以这里的取值范围是0-255

 

整形提升的补充

1的补码是全11111111111111111111111111111111

整形打印不满足32位 要进行整形提升 

———————————————————————————————————————————

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

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

相关文章

javaWeb网上订餐管理系统

一、简介 在当今社会&#xff0c;随着互联网的普及&#xff0c;网上订餐已经成为了人们生活中不可或缺的一部分。为了方便用户点餐&#xff0c;同时也方便商家管理订单&#xff0c;我设计了一个基于JavaWeb的网上订餐管理系统。该系统分为前台和后台两部分&#xff0c;前台包括…

ChatGPT助力论文写作:详细步骤解析

前言 在论文写作过程中&#xff0c;尽管人工智能工具如ChatGPT能为我们提供有效的辅助&#xff0c;但我们必须铭记&#xff0c;这些工具并不能完全取代我们的思考与判断能力。本指南将详尽地展示如何利用ChatGPT辅助论文写作的全过程&#xff0c;旨在帮助您更高效地完成学术任…

AI基础知识扫盲

AI基础知识扫盲 AIGCLangchain--LangGraph | 新手入门RAG&#xff08;Retrieval-Augmented Generation&#xff09;检索增强生成fastGPT AIGC AIGC是一种新的人工智能技术&#xff0c;它的全称是Artificial Intelligence Generative Content&#xff0c;即人工智能生成内容。 …

uniapp的配置文件、入口文件、主组件、页面管理部分

pages.json 配置文件&#xff0c;全局页面路径配置&#xff0c;应用的状态栏、导航条、标题、窗口背景色设置等 main.js 入口文件&#xff0c;主要作用是初始化vue实例、定义全局组件、使用需要的插件如 vuex&#xff0c;注意uniapp无法使用vue-router&#xff0c;路由须在pag…

[NKCTF 2024]web解析

文章目录 my first cms全世界最简单的CTF解法一解法二 my first cms 打开题目在最下面发现是CMS Made Simple&#xff0c;版本为2.2.19 扫一下发现存在后台登陆界面&#xff0c;直接访问 用字典爆破下admin的密码为Admin123 然后直接登录&#xff0c;去漏洞库搜一下其实存在…

后端常问面经之Java集合

HashMap底层原理 HashMap的数据结构&#xff1a; 底层使用hash表数据结构&#xff0c;即数组和链表或红黑树 当我们往HashMap中put元素时&#xff0c;利用key的hashCode重新hash计算出当前对象的元素在数组中的下标 存储时&#xff0c;如果出现hash值相同的key&#xff0c;此…

恒创科技:服务器反应慢如何解决?

​  通常来说&#xff0c;访问者会在最初的几秒钟内决定是留在您的网站还是离开。如果页面加载时间超过五秒&#xff0c;访问者离开的可能性就会增加 90%。所以&#xff0c;作为站长们&#xff0c;必须减少服务器响应时间&#xff0c;以确保其网站加载速度更快。以下是减少网…

Mac电脑虚拟显示器:BetterDisplay Pro for Mac v2.0.11激活版

BetterDisplay Pro是一款由waydabber开发的Mac平台上的显示器校准软件&#xff0c;可以帮助用户调整显示器的颜色和亮度&#xff0c;以获得更加真实、清晰和舒适的视觉体验。 软件下载&#xff1a;BetterDisplay Pro for Mac v2.0.11激活版 以下是BetterDisplay Pro的主要特点&…

蔚来JAVA面试(收集)

先叠加&#xff0c;这个是自己找的答案不一定对&#xff0c;只是给我参考看看而已。 一、项目 这个没有&#xff0c;根据实际项目情况来。蔚来比较喜欢拷打项目&#xff0c;所以要对项目非常熟悉&#xff08;慌&#xff09; 二、JAVA基础 2.1 Java中的IO模型有用到过吗&#…

Android视角看鸿蒙第九课-鸿蒙的布局

鸿蒙的四大布局 导读 前面八篇文章描述了鸿蒙app的配置文件&#xff0c;关于版本号&#xff0c;开发版本&#xff0c;桌面图标等等配置方式。从这一篇文章开始学习鸿蒙的UI使用方式。 前面我们学习到鸿蒙有ability和page的区分&#xff0c;ability类似Activity但又不完全一样…

如何使用PHP和RabbitMQ实现延迟队列(方式二)?

前言 前几天写了一篇关于PHP和RabbitMQ如何通过插件实现延迟队列的功能。 今天写另外一篇不需要插件的方式&#xff0c;使用RabbitMQ的死信队列&#xff08;Dead-Letter-Exchanges, DLX&#xff09;和消息TTL&#xff08;Time-To-Live&#xff09;。 这种方法涉及到设置消息…

java Web餐馆订单管理系统用eclipse定制开发mysql数据库BS模式java编程jdbc

一、源码特点 JSP 餐馆订单管理系统是一套完善的web设计系统&#xff0c;对理解JSP java 编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,eclipse开发&#xff0c;数据库为Mysql5.0&#xff0c;使…

vivo x fold 3Pro参数配置 vivo x fold 3Pro续航

vivo XFold3 Pro采用了顶级的AMOLED折叠屏&#xff0c;屏幕预计会配备一块6.53英寸的外屏以及8.03英寸的内屏&#xff0c;分辨率高达2K级别&#xff0c;屏幕支持120Hz刷新率&#xff0c;色彩鲜艳&#xff0c;视觉效果一流。不论是看电影、玩游戏还是日常使用&#xff0c;都能给…

碳实践|企业组织碳排放源识别方法、案例分析,及注意事项

在上一章中讲到“界、源、算、质、查”五步法实现企业组织碳的完整核算流程&#xff0c;本章将针对其中的“源”- “识别排放源”这一步骤来展开,主要分析其识别方法、实操案例&#xff0c;并列举注意事项。 企业识别碳排放源是指在组织边界内找到产生碳排放的设施&#xff0c;…

spark广播变量

广播变量应用场景 由于spark的应用场景通常是分布式场景&#xff0c;在本地集合和分布式集合关联&#xff0c;且本地集合不太大的场景&#xff0c;rdd的处理是在不同的executor中不同的分区处理的&#xff0c;我们定义的全局变量通常是在driver中的&#xff0c;在executor中并…

centos 虚拟机 增加硬盘 虚拟机centos磁盘扩容

2 在centos 7 系统中挂载磁盘 2.1 查看磁盘信息 进入centos 7系统中&#xff0c;输入“# df -h”命令&#xff0c;查看磁盘信息。 这里没有写显示新增的磁盘信息。 2.2 对新加的磁盘进行分区操作 2.2.1 查看磁盘容量和分区 2.2.2 创建分区 a. 选择新增的磁盘&#xff08;这…

学点儿Java_Day10_集合框架(List、Set、HashMap)

1 简介 ArrayList: 有序(放进去顺序和拿出来顺序一致)&#xff0c;可重复 HashSet: 无序(放进去顺序和拿出来顺序不一定一致)&#xff0c;不可重复 Testpublic void test1() {String[] array new String[3];//List: 有序 可重复//有序: 放入顺序 与 拿出顺序一致&#xff0c;…

为何ChatGPT日耗电超50万度?

看新闻说&#xff0c;ChatGPT每天的耗电量是50万度&#xff0c;国内每个家庭日均的耗电量不到10度&#xff0c;ChatGPT耗电相当于国内5万个家庭用量。 网上流传&#xff0c;英伟达创始人黄仁勋说&#xff1a;“AI的尽头是光伏和储能”&#xff0c;大佬的眼光就是毒辣&#xff…

Luminar Neo:重塑图像编辑新纪元,Mac与Win双平台畅享创意之旅

在数字时代的浪潮中&#xff0c;图像编辑软件已成为摄影师和设计师们不可或缺的创作工具。Luminar Neo&#xff0c;作为一款专为Mac与Windows双平台打造的图像编辑软件&#xff0c;正以其卓越的性能和创新的编辑功能&#xff0c;引领着图像编辑的新潮流。 Luminar Neo不仅继承…

【日常linux操作命令】

文章目录 1、查看服务器信息1.1、查看内存1.2、查看磁盘1.3、查看CPU信息 2、清理内存缓存2.1、清理PageCache&#xff1a;2.2、清理Dentries和Inodes&#xff1a;2.3、同时清理PageCache、Dentries和Inodes&#xff1a;2.4、清理日志文件2.5、清理临时文件 3、查找文件3.1、查…