字长

在電腦領域，對於某種特定的電腦設計而言，**字組**（英語：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 和它的更原始版本中可以看到。

## 字組長表

## 參見

* 位元
* 位元組
* 32 位元
* 64 位元

## 參考資料

* 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）