字 (计算机)
在电脑领域,对于某种特定的计算机设计而言,字(英语:word)是用于表示其自然的数据单位的术语。在这个特定电脑中,字是其用来一次性处理事务的一个固定长度的位(bit)组。一个字的位数(即字长)是电脑系统结构中的一个重要特性。
字长度在计算机结构和操作的多个方面均有体现。电脑中大多数寄存器的大小是一个字长。电脑处理的典型数值也可能是以字长为单位。CPU和内存之间的数据传送单位也通常是一个字长。还有在内存中用于指明一个存储位置的地址也经常是以字长为单位的。
现代电脑的字长通常为16、32、64位。其他曾经使用过的字长有:8、9、12、18、24、36、39、40、48、60位;slab是早期的另一个字长实例。某些最早期的电脑是十进制的而不是二进制的,通常拥有10位或者12位的十进制数字作为字长,还有一些早期的电脑根本就没有固定字长。
有时候字长被定义为某个特定值是为了与早期的电脑保持兼容。现在个人电脑中最通用的微处理器(例如:Intel的Pentium系列和AMD的Athlon系列)就是一个例子。它们中的IA-32构架是早期的具有16位字长的Intel 8086构架的扩展。而IA-32处理器仍然支持8086(x86)程序程序所以在IA-32中,“字段”的含义仍然为16位,尽管事实上它运行起来(特别是当默认操作数为32位时)更像一台32位电脑。类似地,在更新型的x86-64构架中,“字”仍然是16位的,虽然64位操作数更为常见。
字的使用
根据计算机的组织情况,字长单位可能被应用到:
- 整数–计算机处理的整数值通常可以有若干种不同的长度,但是其中总有一种正好是该构架的字长。如果有的话,其他的整数长度很可能是字长的倍数或分数。小尺寸的整数尺寸通常是为了提高存储效率;当它被加载处理器时,它经常被转换成字长尺寸的形式。
- 浮点数–计算机处理的浮点数通常是一个字长或字长的倍数。
- 地址–计算机处理的存储器地址必须有足够的尺寸,以便可以表示需要的数值范围,但是又不能过大。经常使用的尺寸是字,不过也可以是字的倍数或分数。
- 寄存器– 处理器寄存器根据它要处理的数据类型被设计成适当的尺寸,例如:整数、浮点数、地址。许多计算机构架使用“通用”寄存器,它们可以存储任何类型的数据,可以允许存储哪怕是最大的数据类型。它们的尺寸通常是其构架的字长。
- 存储器-处理器传送–当处理器从存储器子系统读取数据至寄存器,或者,写寄存器数据到存储器,传送的数据通常是字。在简单的存储系统中,字在数据总线上传送,它一般为一个字或半个字。在使用缓存的存储系统,在处理器和一级缓存之间传送的是一个字长,而在更低级的存储层次上传送的可能是更大的尺寸(这尺寸是字的倍数)。
- 编址单位–在一个给定的构架中,连续的地址值对应连续的存储器单位;该单位就是编址单位。在大部分计算机中,这个单位或者是一个字符(例如:字节)或者是一个字(少部分计算机也使用位(bit)编址单位)。如果单位是字,那么用指定长度的地址就可以访问较大数量的存储空间。另一方面,如果单位是字节,那么就可以访问单个的字符(i.e. selected during the memory operation)。
- 指令– 机器指令通常是字长的分数或倍数。因为指令和数据经常共享同一个存储子系统,所以自然作出这样的选择。而在哈佛架构(Harvard architecture)中,指令和数据的长度并不需要有关联。
字长的选择
在设计计算机时,字长的选择是非常重要的。设计上的考虑倾向于为特定的用途(如地址)设定特定的位长。然而,出于经济的考虑,又应该仅使用一种尺寸,或者很少的几种与基本尺寸成倍数或分数(约数)关系的尺寸。这个首选的基本尺寸就成为该构架的字长。
字符的尺寸对于字长的选择也有影响。20世纪60年代中期以前,字符大部分以6位存储;这样最多允许64个字符,因此不能有大写字母。由于将字长定义成字符尺寸的倍数在处理时间和存储空间上都比较划算,所以这个时期字长也就被定义为6位(在二进制机器上)的倍数。通常的选择是36位字长,这也是适合于浮点数格式的一个长度。
随着IBM360系统的引入——该系统使用8位字符,并支持大小写字母——标准的字符(确切地说:字节)尺寸也转变成为8位。从那以后,字长也自然变成了8的倍数,16、32、64位字长被广泛使用。
各种字长的架构
早期的计算机设计中包括可变字长设计。在这类设计中,数字操作数没有固定的长度,它们通过检查某个特殊字符来判断是否结束。这样的机器使用BCD编码表示数字,例如IBM 702、IBM 705、IBM 7080、IBM 7010、UNIVAC 1050、IBM 1401和IBM 1620。
大部分这样的机器一次处理一个存储单元,因为每条指令和数据占用的数个单元,所以指令将使用数个周期来读取存储器。这类机器经常因为这个原因变得非常慢。例如,在IBM 1620 Model I上,取指令需要8个周期,只是为了读取12个数字(Model II降低到6个周期,不过如果指令不需要取其中的一个1个地址域的话,可以只需要4个周期;如果两个都不需要,则只需要1个周期)
字和字节编址
字长对计算机构架的存储器模式有很大的影响。特别是:通常选择字作为存储器的编址方案,所谓存储器编址方案就是地址码能够指定的最小存储单位。In this approach,编号相邻的存储器字,其地址编号相差一。在计算机中这样很自然,因为它通常总是要处理以字为单位的数据(或者是以字的倍数)。并且具有让指令可以使用最小的长度来指定一个地址的优点,这样,就可以减少指令长度或者可以定义更多的指令条数。
当计算机很大的工作量是用来处理字节时,通常定义字节作为地址编址单位要比字更好。这样做字符串中的单个字符可以通过地址直接指定。当然,一个字仍然可以被地址访问,但是比起字编址方案,它的地址将使用更多的位数。在这种组织结构中,字长需要被定义为字符长度的整数倍。这种编址方案在IBM 360中被使用,此后即变成计算机设计中最普遍的方案。
2的幂
数据常常要占用不同大小的存储空间,例如,有些数值比其他的数值要求有更高的精度。通常使用的长度是编址单位(以字为单位编址或以字节为单位编址)的倍数,这个倍数常常是的2的幂。这样做是比较便利的,因为这样的话,将一个处理对象在数组中的索引值转化为这个处理对象的地址只需要进行一个移位操作(这在硬件上只需要进行布线的变化)而不需要进行乘操作。某些时候这样的做法还可以避免除操作。因此,一些现代计算机设计使用的字长(或者其他的操作数)是2的幂乘以字节尺寸。
字长家族
随着计算机设计日益复杂,一个单一字长的核心作用在计算机架构中已经不那么重要。虽然硬件有能力支持更宽的数据类型,但是在扩展处理器性能时,市场却有强大的压力要求新产品保持向后兼容。因此,在一个新构架的向后兼容的设计中,核心的字长不得不与原始机型的字长共存。原始的字长在未来设计中保持可用,这就构成了字长家族的基础。
这种情形的一个主要的实例是x86系列的设计。原始的8086构架无疑是使用16位字长的。80386在8086的基础上进行了大幅改进,使其基于32位系统构架。如果不用考虑其他因素,它将是32位的,但是作为8086的扩展,它的字长继续被当作16位的。(也因此,有人说80386和它的后继处理器是"32位"的(32-bit),但不是32位字的(32-bit word),原文:As a result of this, one hears of the 80386 and successor processors as being "32-bit", but usually not as having a 32-bit word.——译者)同样的情形最近又发生了,当AMD64构架使64位在系统构架具有主要地位,但是它仍然没有放弃对16位和32位的支持。
因此,今天我们看到的计算机体系结构更多的是基于一个有联系的、类似的字长家族,而不是一个单一的字长体系结构。这些尺寸以整因子(integral factors)——通常是2的幂——互相关联。直接将它们中的任何一个尺寸定义为该系统的字长是武断的,因为这些尺寸的设计可能是因为这一系列体系构架的发展的历史原因,而不是体系自己的最新设计中的特性。
Dword和Qword
在计算机科学中, dword(双倍字)是一种数据单位,它是字的二倍或者说是qword的一半。在具有16位字长的x86平台上,dword数据单位具有32位长度。
qword(四倍字)是一种大小是字长的四倍的数据单位。在通用的x86平台上,该单位的数据具有64位,因为x86系统的字定义为16位(不论实际的机器上工作在那个基本位长上的)
另外,Intel使用术语double quadruple word,或者DQWord(双四倍字)来指定128位数据,这在SSE和它的更原始版本中可以看到。
字长表
年份 | 计算机 架构 |
字长 | 整数 长度 |
浮点数 长度 |
指令长度 | 编址单位 | 字符 长度 |
---|---|---|---|---|---|---|---|
1941 | Zuse Z3 | 22 b | – | w | 8 b | w | – |
1942 | ABC | 50 b | w | – | – | – | – |
1944 | Harvard Mark I | 23 d | w | – | 24 b | – | – |
1946 (1948) {1953} |
ENIAC (w/Panel #16) {w/} |
10 d | w, 2w (w) {w} |
– | – (2d, 4d, 6d, 8d) |
– – {w} |
– |
1951 | UNIVAC I | 12 d | w | – | ½w | w | 1 d |
1952 | IAS machine | 40 b | w | – | ½w | w | 5 b |
1952 | IBM 701 | 36 b | ½w, w | – | ½w | ½w, w | 6 b |
1952 | UNIVAC 60 | n d | 1d, ... 10d | – | – | – | 2d, 3d |
1953 | IBM 702 | n d | 0d, ... 511d | – | 5d | d | 1 d |
1953 | UNIVAC 120 | n d | 1d, ... 10d | – | – | – | 2d, 3d |
1954 (1955) |
IBM 650 (w/IBM 653) |
10 d | w | – (w) |
w | w | 2 d |
1954 | IBM 704 | 36 b | w | w | w | w | 6 b |
1954 | IBM 705 | n d | 0d, ... 255d | – | 5d | d | 1 d |
1954 | IBM NORC | 16 d | w | w, 2w | w | w | – |
1956 | IBM 305 | n d | 1d, ... 100d | – | 10d | d | 1 d |
1958 | UNIVAC II | 12 d | w | – | ½w | w | 1 d |
1958 | SAGE | 32 b | ½w | – | w | w | 6 b |
1958 | Autonetics Recomp II | 40 b | w, 79 b, 8d, 15d | 2w | ½w | ½w, w | 5 b |
1959 | IBM 1401 | n d | 1d, ... | – | d, 2d, 4d, 5d, 7d, 8d | d | 1 d |
1959 (TBD) |
IBM 1620 | n d | 2d, ... | – (4d, ... 102d) |
12d | d | 2 d |
1960 | LARC | 12 d | w, 2w | w, 2w | w | w | 2 d |
1960 | IBM 1410 | n d | 1d, ... | – | d, 2d, 6d, 7d, 11d, 12d | d | 1 d |
1960 | IBM 7070 | 10 d | w | w | w | w, d | 2 d |
1960 | PDP-1 | 18 b | w | – | w | w | 6 b |
1961 | IBM 7030 (Stretch) |
64 b | 1b, ... 64b, 1d, ... 16d |
w | ½w, w | b, ½w, w | 1 b, ... 8 b |
1961 | IBM 7080 | n d | 0d, ... 255d | – | 5d | d | 1 d |
1962 | UNIVAC III | 25 b, 6 d | w, 2w, 3w, 4w | – | w | w | 6 b |
1962 | UNIVAC 1107 | 36 b | 1/6w, ⅓w, ½w, w | w | w | w | 6 b |
1962 | IBM 7010 | n d | 1d, ... | – | d, 2d, 6d, 7d, 11d, 12d | d | 1 d |
1962 | IBM 7094 | 36 b | w | w, 2w | w | w | 6 b |
1963 | Gemini Guidance Computer | 39 b | 26 b | – | 13 b | 13 b, 26 b | – |
1963 (1966) |
Apollo Guidance Computer | 15 b | w | – | w, 2w | w | – |
1964 | CDC 6600 | 60 b | w | w | ¼w, ½w | w | 6 b |
1965 | IBM 360 | 32 b | ½w, w, 1d, ... 16d |
w, 2w | ½w, w, 1½w | 8 b | 8 b |
1965 | UNIVAC 1108 | 36 b | 1/6w, ¼w, ⅓w, ½w, w, 2w | w, 2w | w | w | 6 b, 9 b |
1965 | PDP-8 | 12 b | w | – | w | w | 8 b |
1970 | PDP-11 | 16 b | w | 2w, 4w | w, 2w, 3w | 8 b | 8 b |
1971 | Intel 4004 | 4 b | w, d | – | 2w, 4w | w | – |
1972 | Intel 8008 | 8 b | w, 2d | – | w, 2w, 3w | w | 8 b |
1972 | Calcomp 900 | 9 b | w | – | w, 2w | w | 8 b |
1974 | Intel 8080 | 8 b | w, 2w, 2d | – | w, 2w, 3w | w | 8 b |
1975 | Cray-1 | 64 b | 24 b, w | w | ¼w, ½w | w | 8 b |
1975 | Motorola 6800 | 8 b | w, 2d | – | w, 2w, 3w | w | 8 b |
1975 | MOS Tech. 6501 MOS Tech. 6502 |
8 b | w, 2d | – | w, 2w, 3w | w | 8 b |
1976 | Zilog Z80 | 8 b | w, 2w, 2d | – | w, 2w, 3w, 4w, 5w | w | 8 b |
1978 (1980) |
Intel 8086 (w/Intel 8087) |
16 b | ½w, w, 2d (w, 2w, 4w) |
– (2w, 4w, 5w, 17d) |
½w, w, ... 7w | 8 b | 8 b |
1978 | VAX-11/780 | 32 b | ¼w, ½w, w, 1d, ... 31d, 1b, ... 32b | w, 2w | ¼w, ... 14¼w | 8 b | 8 b |
1979 | Motorola 68000 | 32 b | ¼w, ½w, w, 2d | – | ½w, w, ... 7½w | 8 b | 8 b |
1982 (1983) |
Motorola 68020 (w/Motorola 68881) |
32 b | ¼w, ½w, w, 2d | – (w, 2w, 2½w) |
½w, w, ... 7½w | 8 b | 8 b |
1985 | ARM1 | 32 b | w | – | w | 8 b | 8 b |
1985 | MIPS | 32 b | ¼w, ½w, w | w, 2w | w | 8 b | 8 b |
1989 | Intel 80486 | 16 b | ½w, w, 2d w, 2w, 4w |
2w, 4w, 5w, 17d | ½w, w, ... 7w | 8 b | 8 b |
1989 | Motorola 68040 | 32 b | ¼w, ½w, w, 2d | w, 2w, 2½w | ½w, w, ... 7½w | 8 b | 8 b |
1991 | PowerPC | 32 b | ¼w, ½w, w | w, 2w | w | 8 b | 8 b |
2000 | IA-64 | 64 b | 8 b, ¼w, ½w, w | ½w, w | 41 b | 8 b | 8 b |
2002 | XScale | 32 b | w | w, 2w | ½w, w | 8 b | 8 b |
说明: b:位, d: 10进制数, w:该构架的字长, n:变量长度(variable size) |
参见
参考资料
- Gerrit A. Blaauw & Frederick P. Brooks, Computer Architecture: Concepts and Evolution(Addison-Wesley, 1997, ISBN 0-201-10557-8)
- Anthony Ralston & Edwin D. Reilly, Encyclopedia of Computer Science Third Edition(Van Nostrand Reinhold, 1993, ISBN 0-442-27679-6)