编程卓越之道(卷1):深入理解计算机(第2版)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.4.2 位串

将多位组成序列可构成二进制表示形式,其和其他数值表示形式是等效的,比如十六进制和八进制。大多数计算机系统支持固定的位数,因此这些系统使用的位串是定长的。

半字节(Nibble)是四位数据的集合。大多数计算机系统不支持以半字节访问内存中的数据。注意,每个半字节刚好可以表示一个十六进制数字。

字节(Byte)的长度是八位,许多CPU支持的最小可寻址数据条目就是一个字节。也就是说,CPU可以从内存中获取八位一组的数据。因此,许多语言支持的最小数据类型都占用1字节的内存(无论该数据类型实际用到了几位)。

字节是大多数计算机中最小的存储单元,而且许多语言都使用一个字节来表示小于8位的对象,所以,我们需要使用一种方法来标记字节中的每一位。这里我们使用位编号来描述字节内的位。如图2-3所示,第0位是字节的低位(LO,Low-Order)或最小有效(Least Significant)位,第7位是字节的高位(HO,High-Order)或最大有效(Most Significant)位。我们按编号引用位。

图2-3 字节的位编号 

(Word)的长度因CPU而异,可以是16位、32位或64位。本书采用80x86术语,一个字定义为16位的集合。和字节一样,我们使用位编号来描述字中的每一位,从低位的0位开始,到高位的15位结束(如图2-4所示)。

图2-4 字的位编号 

注意,一个字正好包含两个字节。第0~7位组成低位(LO)字节,第8~15位组成高位(HO)字节(如图2-5所示)。

图2-5 一个字的两个字节 

顾名思义,双字(Double Word或Dword)就是两个字。因此,双字的长度是32位,如图2-6所示。

图2-6 双字中的位排列

一个双字包含2个字或4个字节,如图2-7所示。

图2-7 双字中的字节和字

如前所述,大多数CPU能够有效处理的对象大小是固定的(现代系统通常是32位或64位)。这并不意味着不能使用位数更多的对象,只是这样做效率较低。编程语言很少处理超过128位或256位的数字对象。某些编程语言可以使用64位整数,而大多数语言都支持64位浮点值,因此我们使用术语四字(Quad Word)来描述这些数据类型。通常,我们使用长字(Long Word)来描述128位的值,尽管现在支持这种数据类型的语言并不多[3],但这为我们提供了扩展的空间。

可以将一个四字分解为两个双字、四个字、八个字节或十六个半字节。同样,可以将一个长字分解为两个四字、四个双字,八个字或十六个字节。

英特尔80x86平台还支持80位的类型,英特尔称之为tbyte(“十字节”,ten byte的缩写)对象。80x86系列CPU使用tbyte类型的变量保存扩展了精度的浮点值和特定的以二进制编码的十进制(BCD)值。

通常,n位的位串最多可以表示2n个不同的值。表2-3展示了半字节、字节、字、双字、四字和长字可以表示的对象数量。

表2-3 位串可以表示的值的数量