64-bit_computing

**64 位元** CPU 是指 CPU 內部的通用暫存器的寬度為 64 位元，支援整數的 64 位元寬度的算術與邏輯運算。

## 原理解釋

一個 CPU，聯絡外部的資料匯流排與位址匯流排，可能有不同的寬度；術語「64 位元」也常用於描述這些匯流排的大小。例如，目前有許多機器有著使用 64 位元匯流排的 32 位元處理器（如最初的 Pentium 和之後的 CPU，但 Intel 的 32 位元 CPU 的位址匯流排寬度最大為 36 位元），因此有時會被稱作「64 位元」。同樣的，某些 16 位元處理器（如 MC68000）指的是 16/32 位元處理器具有 16 位元的匯流排，不過內部也有一些 32 位元的效能。這一術語也可能指電腦指令集的指令長度，或其它的資料項（如常見的 64 位元雙精度浮點數）。去掉進一步的條件，「64 位元」電腦架構一般具有 64 位元寬的整數型暫存器，它可支援（內部和外部兩者）64 位元「區塊」（chunk）的整數型資料。

處理器中的暫存器通常可分為三種：整數、浮點數、其它。在所有常見的主流處理器中，只有整數暫存器（integer register）才可存放指標值（記憶體資料的位址）。非整數暫存器不能存放指標來讀寫記憶體，因此不能用來避開任何受到整數暫存器大小所影響的記憶體限制。

幾乎所有常見的主流處理器（大部分的 ARM 和 32 位元 MIPS 實作是明顯的例外）整合了浮點數硬體，它有可能使用 64 位元暫存器儲存資料，以供處理。例如，x86 架構包含了 x87 浮點數指令，並使用 8 個 80 位元暫存器構成堆疊結構。後來的 x86 修改版和 x86-64 架構，又加入 SSE 指令，它使用 8 個 128 位元寬的暫存器（在 x86-64 中有 16 個暫存器）。與之相較，64 位元 Alpha 系列處理器，除了 32 個 64 位元寬整數暫存器以外，也定義了 32 個 64 位元寬的浮點數暫存器。

## 上限

### 理論上限

64 位元最大的記憶體上限是「16EB」，即「1677 萬 7216TB」、「171 億 7986 萬 9184GB」。現今世界中容量最大的記憶體其實都遠遠低於這個上限，故 64 位元在實際上可被視為**無限大**。

記憶體的大小的演算法是「2 的 XX 次方」，例如 16 位元位的記憶體上限是「2 的 16 次方」即 65536=64KB，而 32 位元為「2 的 32 次方」即 4,294,967,296B=4GB，以此類推而 64 位元就是「**2 的 64 次方**」即 17179869184GB=16777216TB=16384PB=16EB。

### 超越 64 位元

64 位元的上限足足有 171 億 GB，這已經完全滿足了個人所能用到的全部儲存量；不過仍應提到，直至 2007 年 IBM 的 System/370 及後繼者使用 128 位元浮點數，且許多現代處理器也內含 128 位元浮點數暫存器；System/370 及後繼者尤其顯著，在這方面，他們也使用多達 16 位元組的可變長度十進制數（即 128 位元）。

## 歷史發展

### 概述

早在 1960 年代，64 位元架構便已存在於當時的超級電腦，且早在 1990 年代，就有以 RISC 為基礎的工作站和伺服器。2003 年才以 x86-64 和 64 位元 PowerPC 處理器架構的形式引入到（在此之前是 32 位元）個人電腦領域的主流。

目前大部分的 CPU（截至 2005 年），其單個暫存器可存放虛擬記憶體中任意資料的記憶體位址（本機）。因此，虛擬記憶體（電腦在程式的工作區域中所能保留的資料總量）中可用的位址取決於暫存器的寬度。自 1960 年的 IBM System/360 起，然後 1970 年的 DEC VAX 微型電腦，以及 1980 年中期的 Intel 80386，在**事實上**一致開發合用的 32 位元大小的暫存器。32 位元暫存器意味著 232 的位址，或可使用 4 GB 的記憶體。當時在設計這些架構時，4GB 的記憶體遠遠超過一般所安裝的可用量，而認為已足夠用於定址。認為 4GB 位址為合適的大小，還有其它重要的理由：在應用程式中，如資料庫，42 億多的整數已足夠對大部分可計算的實體分配唯一的參考參照。

然而在 1990 年初，成本不斷降低的記憶體，使安裝的記憶體數量逼近 4GB，且在處理某些類型的問題時，可以想像虛擬記憶體的使用空間將超過 4GB 上限。而 64 位元系統的記憶體上限非常高，因此一些公司開始釋出新的 64 位元架構晶片家族，最初是提供給超級電腦、頂級工作站和伺服器機器。64 位元運算逐漸流向個人電腦，在 2003 年，某些型號的蘋果公司 Macintosh 產生線轉向 PowerPC 970 處理器（蘋果公司稱為「G5」），並在 2006 年，轉向 EM64T 處理器，且 x86-64 處理器在頂級的 PC 中遂漸普及。64 位元架構的出現，有效的將記憶體上限提升至 264 位址，相當於 1844 多京或 16 EB 的記憶體。從這個角度來看，在 4 MB 主記憶體很普遍時，最大的記憶體上限 232 的位址大約是一般安裝記憶體的 1000 倍。如今，當 1GB 的主記憶體很普遍時，264 的位址上限大約是 1 百億倍。

今天市面上大部分的消費級 PC 存在著人為的記憶體限制，因受限於實體上的限制，而幾乎不太可能需要用到 16EB 的容量。舉例來說，Apple 的 Mac Pro 最多可安裝實體記憶體至 128GB，而無必要支援超過的大小。最新的 Linux 核心（版本 3.11.2）可編譯成最高支援 64GB 的記憶體。

### 64 位元的大事件革沿

* 1961 年：IBM 發表 IBM 7030 Stretch 超級電腦。它使用 64 位元資料字組，以及 32 或 64 位元的指令字組。
* 1974 年：Control Data Corporation 推出 CDC Star-100 向量超級電腦，它使用 64 位元字組架構（先前的 CDC 系統是以 60 位元架構為基礎）。
* 1976 年：Cray Research 發表第一台 Cray-1 超級電腦。它以 64 位元字組架構為基礎，它成為後來的 Cray 向量超級電腦的基礎。
* 1983 年：Elxsi 推出 Elxsi 6400 平行微型超級電腦。Elxsi 架構具有 64 位元資料暫存器，不過位址空間仍是 32 位元。
* 1991 年：MIPS 科技公司生產第一台 64 位元微處理器，作為 MIPS RISC 架構 R4000 的第三次修訂版本。該款 CPU 使用於以 IRIS Crimson 啟動的 SGI 圖形工作站。然而，IRIX 作業系統並未包含對 R4000 的 64 位元支援，直到 1996 年釋出 IRIX 6.2 為止。Kendall Square Research 發表他們的第一台 KSR1 超級電腦，以專有的執行於 OSF/1 的 64 位元 RISC 處理器架構為基礎。
* 1992 年：Digital Equipment Corporation（DEC）引入純 64 位元 Alpha 架構，其誕生自 PRISM 專案。
* 1993 年：DEC 釋出 64 位元 OSF/1 AXP 類 Unix 作業系統（後來改名為 Tru64 UNIX）和 OpenVMS 作業系統給 Alpha 系統。
* 1994 年：Intel 宣布 64 位元 IA-64 架構的進度表（與 HP 共同開發）作為其 32 位元 IA-32 處理器的繼承者。以 1998–1999 推出時間為目標。SGI 釋出 IRIX 6.0，即支援 64 位元的 R8000 CPU。
* 1995 年：Sun 推出 64 位元 SPARC 處理器 UltraSPARC。富士通所有的 HAL 電腦系統推出以 64 位元 CPU 為基礎的工作站，HAL 獨立設計的第一代 SPARC64。IBM 釋出 64 位元 AS/400 系統，能夠轉換作業系統、資料庫、應用程式的升級。DEC 釋出 OpenVMS Alpha 7.0，第一個全 64 位元版本的 OpenVMS for Alpha。
* 1996 年：HP 釋出 PA-RISC 處理器架構的 64 位元 2.0 版本的實作 PA-8000。任天堂引入 Nintendo 64 電視遊戲主機，以低成本的 MIPS R4000 變體所打造。
* 1997 年：IBM 釋出 RS64 全 64 位元 PowerPC 處理器。
* 1998 年：IBM 釋出 POWER3 全 64 位元 PowerPC/POWER 處理器。Sun 釋出 Solaris 7，以完整支援 64 位元 UltraSPARC。
* 1999 年：Intel 釋出 IA-64 架構的指令集。AMD 首次公開 64 位元集以擴充給 IA-32，稱為 x86-64（後來改名為 AMD64）。
* 2000 年：IBM 推出他自己的第一個相容 ESA/390 的 64 位元大型電腦 zSeries z900，以及新的 z/OS 作業系統。緊接著是 64 位元 Linux on zSeries。
* 2001 年：Intel 推出 64 位元處理器產品線，標記為 Itanium，主打頂級伺服器。但因價錢太高 (Itanium 9560 價錢約為 4650 美金)，因一再拖延 IA-64 市場而導致失敗。Linux 是第一個可執行於該處理器的作業系統。
* 2002 年：Intel 引入 Itanium 2 作為 Itanium 的繼承者。
* 2003 年：AMD 產出他的 AMD64 架構 Opteron 以及 Athlon 64 處理器產品線。蘋果也推出了 64 位元「G5」PowerPC 970 CPU courtesy of IBM，並連同升級他的 Mac OS X 作業系統，其增加對 64 位元模式的部分支援。若干 Linux 發行版本釋出對 AMD64 的支援。微軟宣布將為 AMD 晶片建立新的 Windows 作業系統。Intel 堅持 Itanium 晶片仍維持只有 64 位元的處理器。
* 2004 年：Intel 承認 AMD 在市場上的成功，並著手開發 AMD64 延伸的替代品，稱為 IA-32e，稍後改名為 EM64T。升級版本的 Xeon 和 Pentium 4 處理器家族支援了新推出的指令。Freescale 宣布 64 位元 e700 core，以繼承 PowerPC G4 系列。VIA Technologies 宣布 64 位元的 Isaiah 處理器。
* 2005 年：Sun 於 1 月 31 日釋出支援 AMD64 和 EM64T 處理器的 Solaris 10。3 月，Intel 宣布他的第一個雙核心 EM64T 處理器 Pentium Extreme Edition 840 和新的 Pentium D 晶片將於 2005 第二季推出。4 月 30 日，微軟公開釋出提供給 AMD64 和 EM64T 處理器的 Windows XP Professional x64 Edition。5 月，AMD 引入他的第一個雙核心 AMD64 Opteron 伺服器 CPU，並宣布其桌上型版本，稱為 Athlon 64 X2。將原本的 Athlon 64 X2（Toledo）處理器改為兩個核心，並為每個核心的 L2 配上 1 MB 快取記憶體，以大約 2.332 億個電晶體組成。它有 199 mm² 那麼大。7 月，IBM 宣布他最新的雙核心 64 位元 PowerPC 970MP（codenamed Antares），由 IBM 和 Apple 使用。微軟釋出 Xbox 360 遊戲主機，其使用由 IBM 生產的 64 位元、三核心 Xenon PowerPC 處理器。
* 2006 年：雙核心 Montecito Itanium 2 處理器進入生產。Sony、IBM、Toshiba 開始生產用於 PlayStation 3、伺服器、工作站以及其它應用的 64 位元 Cell 處理器。蘋果公司在新的 Mac Pro 和 Intel Xserve 電腦中採用 64 位元 EM64T Xeon 處理器，稍後更新 iMac、MacBook、MacBook Pro 使用 EM64T Core 2 處理器。
* 2013 年：Apple 推出世界上第一款 64 位元智慧型手機 iPhone 5s，採用 ARM 架構 A7 處理器；同年晚些時候，Apple 推出 iPad Air，採用同款處理器，將 64 位元處理器帶入行動裝置。
* 2014 年：HTC 推出世界上第一款以 Android 系統的 64 位元處理器手機 HTC Desire 820

## 32 位元過渡至 64 位元

### 32 位元與 64 位元的區別

從 32 位元到 64 位元架構的改變是一個根本的改變，因為大多數作業系統必須進行全面性修改，以取得新架構的優點。其它軟體也必須進行移植，以使用新的效能；較舊的軟體一般可藉由**硬體相容模式**（新的處理器支援較舊的 32 位元版本指令集）或軟體**類比**進行支援。或者直接在 64 位元處理器裡面實作 32 位元處理器核心（如同 Intel 的 Itanium 處理器，其內含有 x86 處理器核心，用來執行 32 位元 x86 應用程式）。支援 64 位元架構的作業系統，一般同時支援 32 位元和 64 位元的應用程式。

明顯的例外是 AS/400，其軟體執行在虛擬的指令集架構，稱為 TIMI（技術獨立機器介面），它會在執行之前，以低階軟體轉換成原生機器碼。低階軟體必須全部重寫，以搬移整個 OS 以及所有的軟體到新的平台。例如，當 IBM 轉移較舊的 32/48 位元「IMPI」指令集到 64 位元 PowerPC（IMPI 完全不像 32 位元 PowerPC，所以這比從 32 位元版本的指令集轉移到相同指令集的 64 位元版本的規模還要龐大）。

64 位元架構無疑可應用在需要處理大量資料的應用程式，如數位視訊、科學運算、和早期的大型資料庫。在其它工作方面，其 32 位元相容模式是否會快過同等級的 32 位元系統，這部分已有很多爭論。在 x86-64 架構（AMD64 和 Intel 64）中，主要的 32 位元作業系統和應用程式，可平滑的執行於 64 位元硬體上。

Sun 的 64 位元 Java 虛擬機的啟動速度比 32 位元虛擬機還慢，因為 Sun 仍假定所有的 64 位元機器都是伺服器，而且只有為 64 位元平台實作「伺服器」編譯器（C2）。「客戶端」編譯器（C1）產生較慢的代碼，不過編譯較快速。所以儘管在 64 位元 JVM 的 Java 程式在一段很長的週期會執行的較好（一般為長時間運作的「伺服器」應用程式），它的啟動時間可能更久。對於短生命期的應用程式（如 Java 編譯器 javac）增加啟動時間可控制執行時間，使 64 位元的 JVM 整體變慢。

應當指出，在比較 32 位元和 64 位元處理器時，速度並不是唯一的考量因素。應用程式，如多工、應力測試（stress testing）、叢集（clustering，用於 HPC）可能更適合 64 位元架構以正確部署。為了以上原因，64 位元叢集已廣泛部署於大型組織，如 IBM、Vodafone、HP、微軟。

### 32 位元和 64 位元的優缺點

一個常見的誤解是：除非電腦安裝的記憶體大於 4GB，否則 64 位元架構不會比 32 位元架構好。這不完全正確：

* 部分作業系統保留了一部分行程位址空間供作業系統使用，減少使用者程式可用於對映記憶體的位址空間。例如，Windows XP DLL 以及 userland OS 元件對映到每一個行程的位址空間，即使電腦裝有 4 GB 的記憶體，也僅剩下 2 至 3.8 GB（端視其設定）的可用位址空間。這個限制在 64 位元 Windows 中不會出現。
* 檔案的記憶體對映不再適合 32 位元架構，尤其是相對便宜的 DVD 燒錄技術的引入。大於 4 GB 的檔案不再罕見，如此大的檔案無法簡單的對映到 32 位元架構的記憶體，只能對映檔案的一部分範圍到位址空間，並以記憶體對映存取檔案。當有需要時，就必須將這些範圍對映進或對映出位址空間。這是一個問題，因為充裕的記憶體對映仍是從磁碟至記憶體最有效率的存取方法，如果作業系統能適當實行的話。

64 位元架構主要的缺點是，相對於 32 位元架構，佔用相同的資料會消秏更多的記憶體空間（由於腫漲的指標，以及其它型態和對齊補白等可能）。這會增加行程對記憶體的需求，且可能會影響高效能處理器快取的使用。解決方法之一是維持一部分 32 位元模型，且大致合理有效。高效能導向的 z/OS 作業系統便採取這個方法，要求程式碼存放在 32 位元位址空間的任一數字，資料物件則可（選擇性）存放在 64 位元區域。

目前主要的商業軟體是建立在 32 位元代碼，而非 64 位元代碼，所以不能取得在 64 位元處理器上較大的 64 位元位址空間，或較寬的 64 位元暫存器和資料路徑的優點。然而，免費或自由軟體作業系統的使用者已經可以使用專有的 64 位元運算環境。並非所有的應用程式都需要大量的位址空間或操作 64 位元資料項，所以這些程式不會享受到較大的位址空間或較寬的暫存器和資料路徑的好處；主要受益於 64 位元版本的應用程式，並不會享受到使用 x86 的版本，會有更多的暫存器可以使用。

### 軟體的可用性

64 位元系統往往缺乏對應的軟體，多數軟體均按 32 位元架構編寫。最嚴重的問題是不相容的驅動程式。儘管 32 位元相容模式（又稱作類比模式，即微軟 WoW64 技術）可執行大部分軟體，但通常無法執行驅動程式（或類似軟體），因為驅動程式通常在作業系統和硬體之間執行，無法使用直接類比。許多開放源始碼軟體封包可簡單的從源始碼編譯為可執行於 64 位元環境作業系統，如 Linux。所需的條件是供給 64 位元機器的編譯器（通常是 gcc）。

因為裝置的驅動程式通常執行於作業系統核心（Kernel）的內部，有可能以 32 位元行程執行核心，同時支援 64 位元的使用者行程。以在核心裡的額外消耗為代價，如此可為使用者提供受益於 64 位元的記憶體和效能，且不破壞現存 32 位元驅動程式的二進制相容性。這個機制源於 OS X 啟用 64 位元行程，同時支援 32 位元的驅動程式。

大多數 32 位元軟體都在新的 64 位元作業系統上執行，但是防毒軟體會有相容性問題。

## 64 位元資料模型

以高階語言編寫的應用軟體，從 32 位元架構轉換到 64 位元架構的各種困難。一個共同的問題是，部分程式員假定指標如同其它資料型態一樣有相同的長度。程式員假定它們可以在資料型態之間傳送數量而不遺失資訊。這些假定只在一部分 32 位元機器上如此（甚至是一部分 16 位元機器），不過在 64 位元機器上就不再如此。C 語言及其後代 C++ 尤其容易產生這種錯誤 [1]（頁面存檔備份，存於網際網路檔案館） 。

要在 C 和 C++ 中避免這種錯誤，如果確定原始類型的大小為所需的基礎，`sizeof` 運算子可用來確定原始類型的大小，無論是在編譯以及執行時期。此外，在 C99 標準中的 <limits.h> 表頭，以及在 C++ 標準中的 <limits> 表頭的 numeric\_limits 類別，可提供更多有用的資訊；sizeof 只返回字元大小。這個用法使人產生誤解，因為一個字元（`CHAR_BITS`）的大小是由自身決定，在所有的 C 或 C++ 實作中並未以相同方式定義。然而，除了這些編譯器目標 DSP 以外，「64 位元 = 8 字元（每一字元有 8 位元）」已成標準。

必須謹慎使用 `ptrdiff_t` 型態（在標準表頭 `<stddef.h>` 中）兩個指標相減的結果；太多代碼寧可不正確的使用「int」或「long」。表示一個指標（而不是指標差異）為一個整數，在此可以使用 `uintptr_t`（它只定義在 C99 中，不過某些編譯器另外整合較早版本的標準以提供之，作為一個擴充）。

C 和 C++ 並未定義指標、整數型（int）、長型（long）為特定的位元數目。

在主要的 32 位元機器程式設計環境中，指標、「int」變數、「long」變數全部都是 32 位元長。

然而，在 64 位元機器下的許多程式設計環境，「int」變數仍然是 32 位元寬，不過「long」和指標是 64 位元寬，上述內容稱為 **LP64** 資料模型。另一個選擇是 **ILP64** 資料模型，三種資料型態都是 64 位元寬，甚至 **SILP64** 連「short」變數也是 64 位元寬。然而，大多數情況下所需的修改是相對次要且簡單，而且許多編寫良好的程式可以簡單的重新編譯給新的環境，而無須修改。另一個選擇是 **LLP64** 模型，其維持 32 位元代碼的相容性，使 int 和 long 為 32 位元。「LL」指「long long」型態，其在所有平台下至少是 64 位元，包括 32 位元環境。

今天有許多 64 位元編譯器使用 **LP64** 模型（包括 Solaris、AIX、HP、Linux、Mac OS X、IBM z/OS 原生編譯器）。微軟的 VC++ 編譯器使用 **LLP64** 模型。其缺點是在 LP64 模型中將 long 存放到 int 可能會溢位。另一方面，還會使強制轉型一個指標為 long 可以作用；在 LLP 模型下，情況則剛好相反。兩者皆不應該出現在合乎 C99 的代碼中。

注意，程式設計模型是在預編譯器底層選擇的，且數個模型可共存於同一作業系統。然而一般由 OS API 選擇程式設計模型作為原始模型。

另一個考量是用於驅動程式的資料模式。在現代的作業系統中，驅動程式彌補了大多數的作業系統代碼（儘管許多代碼可能不會載入，當作業系統執行時）。許多驅動程式大量使用指標操控資料，且在某些情況下必須讀入一定大小的指標進入支援 DMA 的硬體。舉個例子，提供給 32 位元 PCI 裝置的驅動程式，請求裝置的 DMA 資料進入 64 位元機器記憶體的較高區域，可能無法滿足來自作業系統從裝置到大於 4 GB 記憶體讀入資料的要求。因為對於這些位址的指標，將不適合裝置的 DMA 暫存器。這個問題可如下解決，當向裝置發出 DMA 請求時，OS 採用與裝置相符的記憶體限制，或者使用 IOMMU。

## 目前的 64 位元微處理器架構

屬於 64 位元的微處理器架構（2006 年）有：

* DEC Alpha 架構（檢視 Digital Alpha timeline（頁面存檔備份，存於網際網路檔案館））
* Intel 的 IA-64 架構（用於 Intel 的 Itanium CPU）
* x86-64 架構，64 位元版本的 x86 架構（又稱作「x64」）
  * AMD 的 AMD64（用於 AMD 的 Athlon 64、Opteron、Sempron、Turion 64、Phenom、Athlon II、Phenom II、APU、AMD FX、Ryzen、EPYC CPU）
  * Intel 的 Intel 64（用於 Intel 部分型號 Pentium 4、Pentium D、Pentium、Celeron、Atom、Xeon CPU，而 Core 2、Intel Core i3/i5/i7/i9 CPU 均支援 Intel 64）
* SPARC 架構（從 SPARC V9 開始的 64 位元）
  * Sun 的 UltraSPARC 架構
  * Fujitsu 的 SPARC64 架構
* IBM 的 POWER 架構（從 POWER3 和 RS64 變體開始的 64 位元）
* IBM/Motorola 的 PowerPC 架構（從 PowerPC 620 和 PowerPC 970 變體開始的 64 位元）
* IBM 的 z/Architecture，used by IBM zSeries 和 System z9 大型電腦，ESA/390 架構的 64 位元版本
* MIPS 科技公司的 MIPS IV、MIPS V、MIPS64 架構
* HP 的 PA-RISC（從 PA-RISC 2.0 開始的 64 位元）
* ARMv8 Cortex-A50（包含 A53, A57）架構，如 Apple A7 處理器

大部分 64 位元處理器架構可原生執行 32 位元版本架構的代碼，而無任何效能損失。這種支援通常稱為**雙架構支援**或更普遍的**多架構支援**。

## 影像

在數位影像中，64 位元為附有 16 位元 Alpha 通道的 48 位元影像。

## 參見

* 隨機存取記憶體
* 32 位元
* 32 位元應用程式
* 16 位元
* 16 位元應用程式

## 參考資料

* x86 和 x64 到底有什麼差異？（頁面存檔備份，存於網際網路檔案館）
* 64-bit 的認定：通用暫存器寬度（頁面存檔備份，存於網際網路檔案館）

本條目部分或全部內容出自以 GFDL 授權發佈的《自由線上電腦詞典》（FOLDOC）。