大端序与小端序
产生原因
为何要有字节序
很多人会问,为什么会有字节序,统一用大端序不行吗?答案是,计算机电路先处理低位字节,效率比较高,因为计算都是从低位开始的。所以,计算机的内部处理都是小端字节序。在计算机内部,小端序被广泛应用于现代 CPU 内部存储数据;而在其他场景,比如网络传输和文件存储则使用大端序。
解释
一些计算机设计师认为,应按从左至右的顺序在 RAM 与 CPU 中存储数字,这种模式称为小端序。另一些计算机设计师则倾向于按从右至左的顺序在存储器中写入数据,这种模式称为大端序。因此,根据“字节序”的不同,二进制序列 1-0-0-0-0-0-1-1 表示的数字也有所不同。
大端序: 2^7 + 2^1 + 2^0=131
小端序:2^0 + 2^6 + 2^7=193
目前的大部分 CPU 采用小端序模式,但同样存在许多采用大端序模式的计算机。如果大端序 CPU 需要解释由小端序 CPU 产生的数据,则必须采取措施以免出现字节序不匹配。程序员直接对二进制数进行操作,在解析来自网络交换机的数据时尤其需要注意这个问题。虽然目前多数计算机采用小端序模式,但由于大部分早期的网络路由器使用大端序 CPU,所以因特网流量仍然以大端序为基础进行标准化。以小端序模式读取大端序数据时将出现乱码,反之亦然。
记忆法则:
数字低位做参考,来回切换倒生乱。
数字低位,放在地址高位算大端;
数字低位,放在地址低位算小端;
m.b = 0x12345678;(这个表述本身就是大端的感觉,只是没有放在内存中)
所以,赋值后这段内存空间内的值就为:
0001 0010 0011 0100 0101 0110 0111 1000 (低32位)
内存左高右低时:
大端存储:78 56 34 12
小端存储:12 34 56 78
附录:另外一种解释:网络上传输都用大端,这是约定
网络序是大端序,主机序可能是大端可能是小端(INTEL,ARM,MIPS等不一样)。
为何要约定呢?
(这个暂时未做验证和理解)
原因在于ip层需要ip和端口进行转发,如果不指定,ip层无法转发。
注意区分字符串和数字,网络传输的都是字符,对于字符串传输没有异议;
而对于数字,要约定先发低位还是先发高位,这就是大端小端的需要。