对于跨越多字节的程序对象,我们必须建立两个规则:这个对象的地址是什么,以及在内存中如何排列这些字节。在几乎所有的机器上,多字节对象都被存储为连续的字节序列,对象的地址为所使用字节中最小的地址。例如,假设一个类型为int的变量x的地址为0x100,也就是说,地址表达式&x的值为0x100(首地址)。那么,(假设数据类型int为32位表示)x的4个字节将被存储在内存的0x100、0x101、0x102和0x103位置。
排列表示一个对象的字节有两个通用的规则。考虑一个w位的整数,其位表示为,其中
是最高有效位,而
是最低有效位。假设w是8的倍数,这些位就能被分组成为字节,其中最高有效字节包含位
,而最低有效字节包含位
,其他字节包含中间的位。某些机器选择在内存中按照从最低有效字节到最高有效字节的顺序存储对象,而另一些机器则按照从最高有效字节到最低有效字节的顺序存储。前一种规则——最低有效字节在前面的方式,称为小端法(little endian)。后一种规则——最高有效字节在最前面的方式,称为大端法。
假设变量x的类型为int,位于地址0x100处,它的十六进制值为0x01234567。地址范围0x100~0x103的字节顺序依赖于机器的类型:
注意,在字0x01234567中,高位字节为0x01,而低位字节为0x67。因此:
大端存储实际上是最高位字节存储在了低位地址中,最低位字节存储在了高位地址中。
小端存储实际上是最低位字节存储在了低位地址中,最高位字节存储在了高位地址中。
那么这两种存储方式除了顺序上不相同,又会影响什么?
在读取数据时,如果使用的是大端模式,从低位地址按顺序读取,对应数据处理会有些麻烦,好处是读取到最高位后立马可以知道该数据的符号位为正还是为负。
在读取数据时,如果使用的是小端模式,从低位地址按顺序读取,只需要依次遍历并累加就可以获取到数据值本身,并且数据的符号位在最后做判断即可。
在写数据时大致相同,只是遍历的方向不同。