字节序
字节间的顺序。主要有两种:大端序和小端序。当然你也可以规定其他的顺序,但这两种顺序是规则最简单的了。
内存:
1 | 内存: -------------------------------> |
大端序:从左往右读,最左边为最高位。反映在内存即最低地址为最高位,最高地址为最低位。
小端序:从右往左读,最右边为最高位。反映在内存即最低地址为最低位,最高地址为最高位。
可以看到,大端序和小端序最高位到最低位的顺序刚好相反,是翻转的关系。
为什么会有字节序?
因为一串数字可以从左开始读,也可以从右开始读。如果不规定读的顺序,那么就无法得知正确的信息。
比如:一张纸上写着1234
按大端序读,最左边的1就是最高位,结果就是一千两百三十四
按小端序读,最右边4就是最高位,最左边的1反而是最低位,结果就是四千三百二十一
可以看到对于同一串文本,读的顺序不同,得到的结果也会不同。大部分国家都是从左到右读,但也有的国家是从右到左读的。没有好坏,纯属习惯问题。因此数字“一千两百三十四”,对于从左到右读的国家,书写出来就是1234。而对于从右到左读的国家,书写出来就是4321。大小端只是记法不同,表达的数字还是同一个。
CPU读取内存中的数据时,是从低地址向高地址方向进行读取的。所以一般计算机的内部处理都是小端字节序(目前为止我就还没遇到过采用大端存储的机器)。但是,人类还是习惯读写大端字节序。所以,除了计算机的内部处理,其他的场合比如网络传输和文件储存,几乎都是用的大端字节序。
举例:
0x1234
0001 0010 0011 0100 (采用大端序存储)-> 0010 1100 0100 1000(采用小端序存储,根据大端翻转即可)
1234 -> 3412(第一个字节代表的就是0x34,小端从右往左读)
0x01
0000 0000 0000 0000 0000 0000 0000 0001(大端序)
->
1000 0000 0000 0000 0000 0000 0000 0000(小端序)