1. 什么是大端小端?如何判断大端小端?
1.1 什么是大端小端
- 大端和小端是指在计算机系统中,不同字节顺序的存储方式。 在一个字节序列中,如果最高位字节存在低有效地址,那么称为大端字节序;反之,如果最低位字节存在低有效地址,那么称为小端字节序。
[例]
int x = 0x12345678; //0x12为最高位有效字节
大端字节序:0x12 0x34 0x56 0x78;
小端字节序:0x78 0x56 0x34 0x12;
- 大端字节序和小端字节序的出现主要是因为不同的处理器和系统对于多字节数据(如整型、浮点型等)存储方式的不同。 比如,Intel x86系列处理器采用小端字节序,而keil, c51,Motorola系列处理器采用大端字节序。有些ARM处理器还可以通过硬件来选择是大端存储模式还是小端存储模式。
1.2 如何判断大端小端?
可通过程序判断。具体来说就是打印出数据的字节序,再按照大小端不同的存储方式进行判断。
[例]
#include <iostream>
int main() {
int num = 1;// 0x 00 00 00 01
char* ptr = (char*)#//如果是大端法,ptr指向的低有效地址上值为0x00;小端法,*ptr = 0x01;
if (*ptr == 1) {
std::cout << "Little endian" << std::endl;
} else {
std::cout << "Big endian" << std::endl;
}
return 0;
}
2. 在进行网路通信时是否需要进行字节序转换?
是的,在进行网络通信时需要进行字节序转换,因为不同的机器可能采用不同的字节序。网络通信中,通信双方需要对数据进行序列化和反序列化,将数据转换为网络字节序进行传输,接收方再将其转换为主机字节序进行处理。
通常,网络字节序采用大端字节序,也称为网络序(Network Order)。因此,在发送数据之前,需要将数据转换为网络字节序;在接收数据之后,需要将其转换为主机字节序。可以使用一些函数来完成字节序转换,例如htons()和htonl()函数用于将短整型和长整型从主机字节序转换为网络字节序;ntohs()和ntohl()函数则用于将短整型和长整型从网络字节序转换为主机字节序。
顺便说说网络字节序
UDP/TCP/IP协议规定,把接收到的第一个字节当作高位字节。这就要求发送端发送的第一个字节是高位字节,而发送端发送的第一个字节是最低有效地址上的字节。换句话说,发送端是从最低有效地址上的字节开始逐个发送,而第一个发送的字节被视为最高位字节。所以说,网络字节序是大端字节序。
比如,在80x86平台中,数据是以小端法存放的。在发送之前就需要使用系统提供的字节序转换函数htonl()将其转换为大端法存放的字节序再发送。
3. 并发和并行的区别是什么?
- 并发: 指两个或多个事件在同一时间段内发生,但不一定同时执行,多个任务交替执行,各自独立的运行。在单个CPU上通过任务切换来实现并发。
- 并行: 指两个或多个事件在同一时刻执行,多个任务同时执行,各自独立的运行。通常是在多个CPU或者多核CPU上实现。
简而言之,对于并发来说,多个任务在时间上是重叠的,但在执行时是交替的;而对于并行来说,多个任务在时间上也是重叠的,但是在执行时是同时进行的。