1. 字节序
计算机硬件有两种储存数据的方式:大端字节序(big endian)和小端字节序(little endian)
- Big endian:高位字节数据存放在低地址处,低位数据存放在高地址处,俗称大端
- Little endian:高位字节数据存放在高地址处,低位数据存放在低地址处,俗称小端
- 通常只有读取的时候,才必须区分字节序,其他情况都不用考虑
1.1. 高低地址
- 栈顶 (低地址)
- 栈底 (高地址)
1.2. 高低字节
- 在十进制中我们都说靠 左边的是高位,靠右边的是低位,在其他进制也是如此。就拿 0x12345678 来说,从高位到低位的字节依次是 0x12、0x34、0x56 和 0x78。
- 0x12 -> 16 进制 对应二进制(0b10010) -> 00001【1】 0010【2】 (1 化 4)
===== 大端 =====
--------------------
栈顶 (低地址)
--------------------| 入栈方向 ,地址增长方向
0x12 -- 高位 | ||
0x34 -- 低位 | ||
0x56 -- 低位 | ||
0x78 -- 低位 | ||
--------------------| V
栈底(高地址)
--------------------|
===== 小端 =====
--------------------
栈顶 (低地址)
--------------------| 入栈方向 ,地址增长方向
0x78 -- 低位 | ||
0x56 -- 低位 | ||
0x34 -- 低位 | ||
0x12 -- 高位 | ||
--------------------| V
栈底(高地址)
--------------------|
1.3. 网络字节序 && 大段字节序
- 网络字节序,是指网络传输的字节序,可能是大端序或者小端序,取决于软件开始时通讯双方的协议规定。 TCP/IP 协议 RFC1700 规定使用“大端”字节序为网络字节序,开发的时候需要遵守这一规则。
例 0x0806 存储
--------------------
栈顶 (低地址)
--------------------| 入栈方向
0x08 -- 高位 | ||
0x06 -- 低位 | ||
--------------------| V
栈底(高地址)
--------------------|