内存字分为大端和小端
处理器可以一次从内存中读取一字节的数据,但是更多时候都会读取由几个连续的字节组
成的一个数字。例如,在微软的 Visual C++ 中,读取 int 值时会读取 4 字节。由于同一个
内存可以以两种不同的方式访问,设计计算机的人必须面对一个问题:首字节,即最低地
址字节,是组成 int 的最高有效位还是最低有效位呢?
乍一看,这似乎没什么问题。当然,一台计算机中的所有部件就“最低地址是 int 的哪一
端”这一点达成一致是非常重要的,否则就会出现混乱。而且,它们之间的区别是非常明
显的。如果 int 值 0x01234567 存储在地址 1000~1003 中,而且首先存储小端,那么在地
址 1000 中存储的是 0x01,在地址 1003 中存储的是 0x67。反之,如果首先存储大端,那
么在地址 1000 中存储的是 0x67,0x01 被存储在地址 1003 中。从首字节地址读取最高有
效位的计算机被称为大端计算机,小端计算机则会首先读取最低有效位。因为有两种存储
整数值(或指针)的方式,而且找不到偏向其中一种的理由,所以工作在不同处理器上的
不同公司的不同团队的选择可能会不同。
问题出在当被写至磁盘上的数据或者由一台计算机通过网络传输的数据会被另外一台计算
机读取的时候。磁盘和网络一次只传送一字节,而不是整个 int 值。所以,这关系到哪一
端首先被存储或发送。如果发送数据的计算机与接收数据的计算机在这一点上不一致,那
么发送的 0x01234567 则会被接收为 0x67452301,导致 int 值发生了改变。
字节序(endian-ness)只是 C++ 不能指定 int 中位的存储方式或是设置联合体中的一个字
段会如何影响其他字段的原因之一。所编写的程序可以工作于一类计算机上,却在另一类
计算机上崩溃,原因也在于字节序。