目录
1. 什么是字节序(Endianness)?
2. 什么是大小端(Big-Endians and Little-Endian)?
3. 什么时候需要用到大小端的概念?
4. 如何确认系统的大小端模式?
5. 什么是大小端定义中的最高有效字节?
6. 什么是大小端定义中的高地址?低地址?
7. 参考链接
思考题:
1. 什么是字节序(Endianness)?
字节序是计算机内存中单个多字节数据(int, float, etc)的字节存储顺序,有大端和小端两种。
2. 什么是大小端(Big-Endians and Little-Endian)?
大端系统中,先存储最高有效字节(MSB)。小端系统中,先存储最低有效字节(LSB)。
比如在存储器0x100~0x103地址中存储uint32_t型的数据0x01234567,在大端系统中的存储顺序为“0x01 0x23 0x45 0x67”,在小端系统中的存储顺序为“0x67 0x45 0x23 0x01”,如下图:
3. 什么时候需要用到大小端的概念?
- 大端和小端两种格式都有各自的优点和缺点。
- 一些算法在小端模式的处理器上运行效率更高,另一些算法则在大端模式的处理器上运行效率更高。
- 大端字节序比较符合人类的阅读习惯,读单个数时,从左到右,MSB在前,LSB在后,比如0x1234;
- 处理器可以设计为小端、大端或双端(能够处理这两种情况)。ARM既支持大端也支持小端,默认工作在小端模式;x86是小端模式;网络协议是大端模式;
- 现在计算机系统中常用的字节序,很大程度上取决于过去消费者和市场的选择。 就像我们选择手机品牌一样,当一种品牌被很多人选择后,它就成了主流。
- 一般只有在不同的处理器之间相互通讯时,需要考虑字节序。
4. 如何确认系统的大小端模式?
方法1:查资料
方法2:运行以下代码来确认当前所使用的处理器的字节序:
#include <stdio.h>int main(void)
{unsigned int value = 0x1;char *r = (char *) &value;if (*r == 1) printf("Your system is Little Endian\n");elseprintf("Your system is Big Endian\n");return 0;
}
5. 什么是大小端定义中的最高有效字节?
单个多字节数据中,数值贡献最大的字节,叫最高有效字节(Most Significant Byte, MSB);数值贡献最小的字节,叫最低有效字节(Least Significant Byte, LSB);也可以理解为组成字节的bits是比较高位的bits的为高字节。比如多字节数据0x12345678,它的MSB为0x12,LSB为0x78。
6. 什么是大小端定义中的高地址?低地址?
地址是用来标识计算机内存中各个存储单元的编号,你可以把它想象成一栋大楼的楼层,每个楼层都有一个唯一的楼层号,而内存中的每个存储单元都有一个唯一的地址。
- 低地址: 通常表示内存的起始位置,就像大楼的一层。
- 高地址: 表示内存的结束位置,就像大楼的顶层。
计算机通过内存地址来有序地操作内存中的数据,存储数据一般从低地址开始存储,最后再存高地址。比如有一个uint32_t型的多字节数据要存入地址0x00~0x03,计算机会先写入0x00;此时0x00为最低内存地址;
7. 参考链接
https://embetronicx.com/tutorials/p_language/c/little-endian-and-big-endian/
What is Endianness? Big-Endian & Little-Endian - GeeksforGeeks
思考题:
1. 32位机器存储uint64_t数据0x1122334455667788时,内存中的字节排布是?
2. 单个多字节数据?结构体算吗?