“字”與“字長”
? ? ? ?關(guān)于這個(gè)問題問的同學(xué)比較多,不懂就查資料,這是個(gè)好習(xí)慣,但有些時(shí)候也害人不淺,現(xiàn)在很多資料(包括網(wǎng)絡(luò)或紙板教材)對(duì)這兩個(gè)概念描述不清晰,甚至是錯(cuò)誤的,在這里討論一下。
? ? ? ?理解這兩個(gè)概念不能望文生義,字長從字面上就是字的長度,貌似沒任何問題,那接下來就是什么是字?大家都知道計(jì)算機(jī)有軟、硬件之分,這個(gè)“字”的概念也有兩個(gè)視角,軟件角度,“字”是一種單位,相當(dāng)于ISA(指令集架構(gòu))定義的一種數(shù)據(jù)類型(我們教材里為了區(qū)別高級(jí)語言的數(shù)據(jù)類型,這里叫數(shù)據(jù)表示),一個(gè)商用ISA考慮到自身的不同版本指令集之間的兼容性,都會(huì)在CPU手冊(cè)中明確自己的各種數(shù)據(jù)類型長度,既然是數(shù)據(jù)類型(數(shù)據(jù)表示)當(dāng)然就是軟件層面的(程序執(zhí)行時(shí)硬件能夠直接識(shí)別的數(shù)據(jù)大?。?,例如x86的字都是2Byte(16-bit):(這里不要認(rèn)為是硬件手冊(cè)就是硬件的范疇,硬件是為執(zhí)行軟件服務(wù)的,它要規(guī)定在它上面執(zhí)行的程序,各種數(shù)據(jù)數(shù)據(jù)類型的大?。?/p>
?例如:
IA32手冊(cè)中:

而ARM、MIPS或RISC-V的字是4B(32-bit):
MIPS手冊(cè)中:

ARM手冊(cè)中:

RISC-V手冊(cè)中:

再看另一個(gè)概念“字長”,它也叫“機(jī)器字長”,它其實(shí)是真正的硬件性能參數(shù),反應(yīng)了CPU的數(shù)據(jù)處理能力,與CPU的通用寄存器和ALU(運(yùn)算邏輯單元)的位數(shù)一致,我們平時(shí)說的多少位CPU,就是指它的字長是多少位的。
綜合上面,“字”是軟件范疇的數(shù)據(jù)類型,“字長”是硬件范疇的性能參數(shù)。不同的ISA其“字”大小是不一樣的(例如x86是2B,ARM等是4B),但同一個(gè)ISA下,為了兼容,“字”類型是統(tǒng)一的(除非不想保持兼容了,Intel曾經(jīng)嘗試過推出IA64,結(jié)果失敗了),不隨“字長”變化而變化,但是“字長”既然是個(gè)性能參數(shù),當(dāng)然會(huì)隨著機(jī)器的升級(jí)而不斷變化了,例如x86的字是2B(16-bit),但是有16位字長的8086(也就是我們常說的16位處理器)、80286,有32位字長的80386、486、奔騰部分系列的IA32,有64位字長的奔騰4及以上機(jī)型的x64。再例如MIPS64,其通用寄存器是64位,及字長是64位,但是字仍然是32位(4B)。
有些資料里還會(huì)提到數(shù)據(jù)總線寬度和機(jī)器字長一樣,這種說法是不準(zhǔn)確的,數(shù)據(jù)總線細(xì)分又分外部數(shù)據(jù)總線和內(nèi)部數(shù)據(jù)總線,處理器在設(shè)計(jì)時(shí)一般通用寄存器GPR和運(yùn)算器及內(nèi)部數(shù)據(jù)總線是一致的,外部數(shù)據(jù)總線反應(yīng)的是CPU和內(nèi)存之間的數(shù)據(jù)傳送能力,兩者不一定一致,例如Intel的8088處理器就是的16位CPU,但是外部數(shù)據(jù)總線是8位的(主要是為了兼容當(dāng)時(shí)大多數(shù)8位的IO設(shè)備),它內(nèi)部數(shù)據(jù)總線仍然是16位的,部分32位奔騰處理器,采用的就是64位外部數(shù)據(jù)線,見下圖(網(wǎng)上沒找到原圖,翻拍手頭的一本書)。

還有一個(gè)性能指標(biāo),就是地址線位數(shù),它反應(yīng)了CPU的物理內(nèi)存尋址能力,它們之間會(huì)有一定制約關(guān)系(畢竟需要相互合作),但是沒有必須誰等于誰這種限制,如上圖,32位奔騰處理器,其字長是32位(說明一次能參與運(yùn)算的數(shù)據(jù)是32位的),其數(shù)據(jù)線是64位的(說明一次內(nèi)存訪問的數(shù)據(jù)寬度是64位的),地址線可以支持36位的(說明其物理內(nèi)存的尋址能力是2^36=64GB(前提它是按字節(jié)編址的)),說明下奔騰有很多型號(hào),不同型號(hào)的地址線位數(shù)不一樣。