程序员面试必考题(十四):数据存储中的大端与小端问题
每个西文字符需要用8个比特表示,而每个汉字需要用16个比特才能表示。在计算机内部,二进制信息的计量单位是“字节”(byte),一个字节等于8个比特。
计算机中运算和处理二进制信息时使用的单位除了比特和字节之外,还经常使用“字”(word)作为单位。必须注意,对于不同计算机,字的长度可能不同。
在考察计算机性能时,一个很重要的性能参数就是机器的“字长”。平时所说的“某种机器是16位机或是32位机”中的16、32就是指字长。所谓“字长”通常是指CPU内部用于整数运算的数据通路的宽度。CPU内部数据通路是指CPU内部的数据流经的路径以及路径上的部件,主要是CPU内部进行数据运算、存储和传送的部件,这些部件的宽度基本上要一致,才能相互匹配。因此,“字长”等于CPU内部用于整数运算的运算器位数和通用寄存器宽度。
“字”和 “字长”的概念不同。“字”用来表示被处理信息的单位,用来度量各种数据类型的宽度。例如,Intelx86微处理器中把一个字定义为16位,但是,从80386微处理器开始,字长就至少是32位了。因此,即使在一个字长为32位的计算机中,32位也被称为双字宽。
存储容量的单位主要有
1KB=1 024字节;
1MB=2^20字节;
1GB=2^30字节;
1TB=2^40字节;
1PB=2^50字节;
1EB=2^60字节;
1ZB=2^70字节。
在描述距离、频率等数值时通常用10的幂次表示,因而在由时钟频率计算得到的总线带宽或外设数据传输率中,度量单位表示的也是10的幂次。
任何信息在计算机中用二进制编码后,得到的都是一串0/1序列,每8位构成一个字节,不同的数据类型具有不同的宽度。如果以字节为一个排列基本单位,那么LSB表示最低有效字节(Least Significant Byte),MSB表示最高有效字节(Most Significant Byte)。例如,数“5” 在32位机器上用int类型表示时的0/1序列为“0000 0000 0000 0000 0000 00000000 0101”,其中MSB=00H,LSB=05H。
现代计算机基本上都采用字节编址方式,即对存储空间的存储单元进行编号时,每个地址编号中存放一个字节。计算机中许多类型数据由多个字节组成,例如,short型数据占两个字节,int和float型数据占4个字节,double型数据占8个字节等,而数据的地址是指其所占若干连续存储单元的地址中最小的地址。例如,在一个按字节编址的计算机中,假定int型变量i的地址为08 00H,i的机器数为01 23 45 67H,则i所占的存储单元的地址为08 00H、08 01H、08 02H和08 03H。那么,01H、23H、45H、67H这4个字节到底该从大地址向小地址存放呢还是该从小地址向大地址存放呢?这就是字节排列顺序问题。
如图1所示,根据数据中各字节在连续存储单元中的排列顺序的不同,可有大端和小端两种排列方式。
大端 ( big endian )方式将数据的最高有效字节 MSB 存放在最小地址单元中,将最低有效字节 LSB 存放在最大地址单元中,即数据的地址就是 MSB 所在的地址。例中变量 i 的 MSB 为 01H , LSB 为 67H 。如图 1 所示,大端方式下,最小地址 0800H 中存放的是变量 i 的 MSB ( 01H ),最大地址 0803H 中存放的是变量 i 的 LSB ( 67 H )。 IBM 360/370,Motorola 68k, MIPS, Sparc, HP PA 等机器都采用大端方式。