大端和小端字节序
Table of Contents
大端序和小端序
大端序(Big-Endian):高位字节放在内存的低地址端,低位字节放在内存的高地址端。
小端序(Little-Endian):低位字节放在内存的低地址端,高位字节放在内存的高地址端。
另一种描述:
大端序(Big-Endian):内存地址从小到大,从数字的高位(大的一端)开始存(所以叫“大端”),后面按顺序存,最终低地址端存的是数字的高位字节,而高地址端存的是数字的低位字节;这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放。和我们”从左到右“阅读习惯一致。
小端序(Little-Endian):内存地址从小到大,从数字低位(小的一端)开始存(所以叫“小端”),后面按顺序存,最终低地址端存的是数字的低位字节,而高地址端存的是数字的高位字节;
记忆方法:小同大异!即小端相同,大端相反!
举例
假设我们要在存储整型数字:439041101,我们把它转为二进制,并以每8位一组分成4组,注意,要从右往左数分组,不能从左往右,因为低位在右侧,这与二进制无关,就算是十进制,八进制,十六进制,都是低位在右侧,这是人类书写和阅读习惯规定的,这与大端小端也是无关,无论是大端还是小端,对于bit(位)序,都是从右往左的(右边低位,左边高位)
11010 00101011 00111100 01001101
当然,由于直接用二进制数字太长了,不方便书写与显示,所以一般都会用十六进制的形式来表示二进制,因为16刚好是24,所以每位十六进制数都可以表示4位二进制数,8位二进制数只需要两位十六进制数来表示即可,这样显示的时候只有两位,不占地儿,方便显示,否则如果满屏都是0101那就眼花缭乱了。
以上的二进制数字转成十六进制为0x1A2B3C4D
,每两位为1个字节,分别按大端和小端模式存放,示意图如下
主机字节序和网络字节序
- 主机字节序(host byte order):电脑/服务器在内存中存储的字节序,跟不同CPU有关,x86架构的都是小端模式,比如Intel/AMD,而PowerPC、IBM Power架构是大端模式,ARM可大端也可小端,但一般都工作在小端模式;
- 网络字节序(network byte order):为了在信息传输时,屏蔽掉不同硬件结构上的字节序的差异,TCP/IP协议规定,所有在网络上传输的多字节整数都以大端序编码。
觉得文章对你有用的话鼓励一下我吧