购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.4 内部数字表示形式

大多数现代计算机系统内部都使用二进制格式来表示值和其他对象。然而,大多数系统的二进制值的位数是有限制的。要写出卓越的代码,就要确保使用机器能够表示的数据对象。本节说明这些值的物理表示。

2.4.1 位

二进制计算机中最小的数据单位是位。一位数据只能表示两个不同的值(通常为0或1)。有人可能认为一位数据没什么用处,但实际上,一位数据可以代表无限多种可能的成对组合。下面是一些例子(可以随意对二进制数据编码):

●零(0)或一(1)

●假(0)或真(1)

●关(0)或开(1)

●男性(0)或女性(1)

●错误(0)或正确(1)

一位数据不仅可以表示二进制数据类型(即只有两个不同值的对象),也可以表示任意两个不同的条目:

●数字723(0)和1245(1)

●红色(0)和蓝色(1)

一位甚至可以表示两个完全不相关的对象。比如,位值0表示红色,而位值1表示数字3256。一位可以表示且只能表示仸意两个不同的值。因此,一位数据不能满足大多数计算需求。为了突破一位数据的限制,人们创造了由多个位组成的序列——位串(Bit String)。

2.4.2 位串

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

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

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

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

img

图2-3 字节的位编号

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

img

图2-4 字的位编号

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

img

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

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

img

图2-6 双字中的位排列

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

img

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

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

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

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

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

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

img
点击中间区域
呼出菜单
上一章
目录
下一章
×