“字”与“字长”
关于这个问题问的同学比较多,不懂就查资料,这是个好习惯,但有些时候也害人不浅,现在很多资料(包括网络或纸板教材)对这两个概念描述不清晰,甚至是错误的,在这里讨论一下。
理解这两个概念不能望文生义,字长从字面上就是字的长度,貌似没任何问题,那接下来就是什么是字?大家都知道计算机有软、硬件之分,这个“字”的概念也有两个视角,软件角度,“字”是一种单位,相当于ISA(指令集架构)定义的一种数据类型(我们教材里为了区别高级语言的数据类型,这里叫数据表示),一个商用ISA考虑到自身的不同版本指令集之间的兼容性,都会在CPU手册中明确自己的各种数据类型长度,既然是数据类型(数据表示)当然就是软件层面的(程序执行时硬件能够直接识别的数据大小),例如x86的字都是2Byte(16-bit):(这里不要认为是硬件手册就是硬件的范畴,硬件是为执行软件服务的,它要规定在它上面执行的程序,各种数据数据类型的大小)
例如:
IA32手册中:

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

ARM手册中:

RISC-V手册中:

再看另一个概念“字长”,它也叫“机器字长”,它其实是真正的硬件性能参数,反应了CPU的数据处理能力,与CPU的通用寄存器和ALU(运算逻辑单元)的位数一致,我们平时说的多少位CPU,就是指它的字长是多少位的。
综合上面,“字”是软件范畴的数据类型,“字长”是硬件范畴的性能参数。不同的ISA其“字”大小是不一样的(例如x86是2B,ARM等是4B),但同一个ISA下,为了兼容,“字”类型是统一的(除非不想保持兼容了,Intel曾经尝试过推出IA64,结果失败了),不随“字长”变化而变化,但是“字长”既然是个性能参数,当然会随着机器的升级而不断变化了,例如x86的字是2B(16-bit),但是有16位字长的8086(也就是我们常说的16位处理器)、80286,有32位字长的80386、486、奔腾部分系列的IA32,有64位字长的奔腾4及以上机型的x64。再例如MIPS64,其通用寄存器是64位,及字长是64位,但是字仍然是32位(4B)。
有些资料里还会提到数据总线宽度和机器字长一样,这种说法是不准确的,数据总线细分又分外部数据总线和内部数据总线,处理器在设计时一般通用寄存器GPR和运算器及内部数据总线是一致的,外部数据总线反应的是CPU和内存之间的数据传送能力,两者不一定一致,例如Intel的8088处理器就是的16位CPU,但是外部数据总线是8位的(主要是为了兼容当时大多数8位的IO设备),它内部数据总线仍然是16位的,部分32位奔腾处理器,采用的就是64位外部数据线,见下图(网上没找到原图,翻拍手头的一本书)。

还有一个性能指标,就是地址线位数,它反应了CPU的物理内存寻址能力,它们之间会有一定制约关系(毕竟需要相互合作),但是没有必须谁等于谁这种限制,如上图,32位奔腾处理器,其字长是32位(说明一次能参与运算的数据是32位的),其数据线是64位的(说明一次内存访问的数据宽度是64位的),地址线可以支持36位的(说明其物理内存的寻址能力是2^36=64GB(前提它是按字节编址的)),说明下奔腾有很多型号,不同型号的地址线位数不一样。

