下面所说的顺序对于存储器来说都是从低地址到高地址:
基本概念
小端(little endian)存储:在存储器中按照最低有效字节到最高有效字节的顺序存储对象。
大多数Intel兼容机采用这种规则。
大端(big endian)规则:在存储器中按照最高有效字节到最低有效字节的顺序存储对象。
大多数IBM和Sun Microsystems的机器采用这种规则,只是大多数,不是按照企业来划分,IBM和Sun的制造的个人计算机使用的是Intel兼容的处理器(小端法)。
双端法(bi-endian):有些比较新的微处理器使用双端法(bi-endian),可以把它们配置成作为大端或者小端的机器运行。
示例
假设一个int数值,位于地址0x100处,它的16进制值是0x01234567,那么它们在虚拟存储器中的排列位置如下:
注意:在字0x01234567,高位字节的十六进制值为0x01,而低位字节值为0x67。
区别
但是到底是使用大端还是小端的字节顺序存储,没有技术上的差别。对我们来说,机器所使用的字节顺序是完全不可见的,无论为哪种类型的机器编译的程序都会得到相同的结果。但是字节顺序会成为问题:
- 在不同类型的机器之间通过网络传送二进制的数据时,一个常见的问题就是当小端法机器产生的数据被送到大端法机器或者反方向发送时会发现,接收程序字里的字节成了反序的。为了避免这个问题,网络应用程序的代码编写必须遵守已经建立的关于字节顺序的规则,以确保发送方机器将它的内部表示转换成网络标准,而接收方机器则将网络标准装换成它的内部表示。
- 阅读表示整数数据的字节序列时字节顺序也很重要,一般是在小端法机器上,当阅读小端法机器生成的机器级程序时,经常会将字节按照相反的顺序显示,主要是因为书写字节序列的时候从左到右是最低位字节到最高位字节(从低地址到高地址),但是书写数字时则是从左到右从高位到低位,在小端机器上正好相反。
下面的代码是由反汇编器生成的,是Intel IA32处理器的机器级代码的文本表示:
80483bd: 01 05 64 94 04 08 add %eax,0x8049464
可以看出十六进制字符串01 05 64 94 04 08
是一条指令的字节级表示,这条指令把一个字长的数据加到存储在主存地址0x8049464的值上。我们可以发现这个字节序列的后四个字节就是add指令右边的数值,但是是相反的顺序,这个就是小端法的阅读上的缺点。 - 强制类型转化(cast)时,会发现int类型12345和float类型12345.0,都是4个字节,但是每个字节的值不同。