主机字节序和网络字节序
不同的CPU有不同的字节序类型,这些字节序是指 整数 在内存中保存的顺序,这个叫做 主机序。最常见的有两种:
1.Little endian:将低序字节存储在起始地址
2.Big endian:将高序字节存储在起始地址
LE little-endian(小端)
- 最符合人的思维的字节序;
- 地址低位存储值的低位;
- 地址高位存储值的高位;
- 怎么讲是最符合人的思维的字节序,是因为从人的第一观感来说;
- 低位值小,就应该放在内存地址小的地方,也即内存地址低位;
- 反之,高位值就应该放在内存地址大的地方,也即内存地址高位;
BE big-endian(大端)
1) 最直观的字节序;
2) 地址低位存储值的高位;
3) 地址高位存储值的低位;
4) 为什么说直观,不要考虑对应关系;
5) 只需要把内存地址从左到右按照由低到高的顺序写出;
6) 把值按照通常的高位到低位的顺序写出;
7) 两者对照,一个字节一个字节的填充进去;
例子:在内存中双字 0x01020304(DWORD) 的存储方式
Addr: 4000 4001 4002 4003 |
x86系列CPU都是little-endian的字节序。网络字节顺序采用big endian排序方式。
网络字节顺序是TCP/IP中规定好的一种数据表示格式,它与具体的CPU类型、操作系统等无关,从而可以保证数据在不同主机之间传输时能够被正确解释。
我们知道计算机正常的内存增长方式是从低到高(当然栈不是),取数据方式是从基址根据偏移找到他们的位置,从他们的存储方式可以看出,大端存储因为第一个字节就是高位,从而很容易知道它是正数还是负数,对于一些数值判断会很迅速。而小端存储 第一个字节是它的低位,符号位在最后一个字节,这样在做数值四则运算时从低位每次取出相应字节运算,最后直到高位,并且最终把符号位刷新,这样的运算方式会更高效。