为什么比特数总是2的幂?

57

我们有8位、16位、32位和64位的硬件架构和操作系统。但没有,比如说,42位或69位。

为什么呢?是因为2^n位更好的选择,还是只是为了与现有系统兼容?(显然,64位寄存器可以容纳两个32位指针,或者32位数据单元可以容纳4个字节,这显然很方便。)


1
正如您从答案中所看到的,这种情况是相对较新的发生。 - San Jacinto
18个回答

34

这在很大程度上是一种传统惯例,甚至并非总是正确的。例如,处理器中浮点数单元(即使是现代处理器)拥有80位寄存器,并没有什么能迫使我们使用8位字节而不是13位字节。

有时候也会有数学原因。例如,如果你决定使用一个N位字节来进行整数乘法,那么你需要正好2N位来存储结果。然后,您还想要对这些2N位整数进行加/减/乘运算,现在您需要2N位通用寄存器来存储加/减结果和4N位寄存器来存储乘结果。


3
我们的一些产品是基于一个具有40位长整型的TI DSP。http://focus.ti.com/docs/toolsw/folders/print/sprc122.html - Dolphin

26

http://en.wikipedia.org/wiki/Word_%28computer_architecture%29#Word_size_choice

不同精度的数据值需要使用不同数量的内存来存储。常用的大小通常是地址解析单元(字节或字)的2的整数次幂倍。将数组中的项的索引转换为该项的地址,只需要执行一次移位操作,而不需要进行乘法运算。在某些情况下,这种关系还可以避免使用除法运算。因此,大多数现代计算机设计的字长(以及其他操作数的大小)都是字节大小的2的整数次幂倍。


3
这就是为什么具有8位最小寻址单元的机器使用16、32...总线宽度,但并没有解释为什么8位字节如此普遍。 - dmckee --- ex-moderator kitten
3
8位字节存在的原因是ASCII编码中7位足以表示英语字符,而第8位可以用于奇偶校验。 - Will Bickford
1
6位足以编码拉丁字母和数字(留下一个空的3/4字节和另一个符号)。一些早期的文本编码甚至只有5位。 - Robert Fraser

22

部分原因是地址相关的。拥有N位地址最多允许你寻址2^N位内存,硬件设计师更喜欢充分利用这一能力。所以,你可以使用3位来寻址8位总线等等...


2
这对我来说是最有意义的。拥有非二次幂位数的位数将浪费地址状态。 - nobody

7
许多早期的非微处理器CPU每个字有一些位数不是2的幂次方。
特别是,Seymour Cray及其团队构建了许多具有非2的幂次方字大小和地址大小的高度有影响力的机器——12位、48位、60位等等。
令人惊讶的是,早期计算机中有很多36位字,这完全是由于人类有10根手指的事实。维基百科上的“36位”文章详细介绍了10根手指和36位之间的关系,并链接到许多其他历史上重要但不再流行的位大小的文章,其中大多数不是2的幂次方。
我猜测:
(a) 8位可寻址内存变得流行是因为它稍微更方便地存储7位ASCII和4位BCD,而不需要任何笨拙的打包或浪费多个位数来表示一个字符;没有其他内存宽度有任何巨大的优势。
(b) 正如Stephen C. Steel所指出的,这种轻微的优势被规模经济和市场力量所放大——使用更多的8位宽度存储器,规模经济使它们稍微便宜一些,导致在新设计中使用更多的8位宽度存储器等等。
(c) 理论上,更宽的总线宽度可以使CPU更快,但将整个CPU放在单个芯片上使得它比任何以前的任何总线宽度的多部件CPU系统都便宜得多,也许略微更快。起初,晶体管数量仅足以制造4位CPU,然后是8位CPU。后来,晶体管数量仅足以制造16位CPU,引起了巨大的轰动和“16位”营销活动。就在人们预计会出现24位CPU的时候……
(d) RISC革命爆发了。前两个RISC芯片是32位的,原因不明,而且人们已经习惯认为“位数越多越好”,所以每个制造商都跳上了32位车。此外,IEEE 754-1985标准化了32位和64位浮点数。有一些24位CPU,但大多数人从未听说过。
(e) 出于软件兼容性的原因,制造商在具有64位前端总线(例如英特尔Pentium和AMD K5等)或具有4位宽总线(LPC总线)的主板上仍然保持着32位数据总线的幻象。

7

古老的 PDP-10 是36位的。


6
我不明白指出一个具体建筑如何回答“为什么”的问题。 - Bryan Oakley
1
@Joonas当时,字符大小为6位,因此36(6 * 6)有意义...这和其他见解都在维基百科文章中涵盖了,Voytek Jarnot在这篇文章中为我们找到了。 - mjv
5
大多数PDP的型号都是奇怪的数字:http://www.village.org/pdp11/faq.pages/WhatPDP.html。此信息很重要,因为它证明了最初的前提是错误的。 - user159335
@fvu,是的,我一直认为字节应该是9位,这样八进制才能正常工作。 - user159335
1
完全与当前问题无关,但想到PDP-10:当我第一次开始使用那台计算机时,我们有300波特的调制解调器。然后有一天我们得到了1200波特的调制解调器。我记得对它们的速度印象深刻。我对一个朋友评论说:“哇,这个东西可以比你读得更快地打印出来!” - Jay
显示剩余6条评论

6

你的内存系统需要以字节为单位进行,这使得你的缓存也需要以字节为单位进行,从而使整个系统都需要以字节为单位进行。

作为一名硬件设计师,通常希望将CPU设计为某种字节边界,即8的倍数。否则,您必须向49位系统添加大量尴尬的电路才能利用mod-8位,否则您会忽略额外的位,除非您需要额外的位进行指令,但在16位或更宽的系统上从不这样。


2
那只是你把8位字节视为基本元素的想法。它们不是,使用18、24和36位机器字的系统曾经很普遍,并且对硬件设计师没有任何问题。 - dmckee --- ex-moderator kitten
我指的是两个不同的问题。只要你有足够的位来覆盖你的指令集或机器字,那就没问题了。它们不需要是字节的倍数。在满足了这个要求之后,你就需要担心内存寻址的问题了。通常情况下,你会以字节、双字或八字为单位访问内存。如果你有一个非字节倍数的架构,你就需要一些翻译器来访问内存和缓存,以获取额外的位,并且寻址数学变得奇怪。我想我的论点仍然归结于约定俗成,因为你总是可以定义一个字节+x的寻址方案。 - SDGator
使用非8位字的机器从来不会访问8位字节的内存,这是事实。能够轻易购买到8位字节的内存只是因果关系中的一个结果,而非原因。8位字节并没有什么根本性质。绝对没有。 - dmckee --- ex-moderator kitten
你说得对...8位字节没有任何根本性。你可以设计任何你想要的东西。但是商业公司没有基本原因会花费大量资金推出无法正常与外围设备、内存等通信的产品。现在这已经成为了惯例,没有任何合理的技术原因去改变它。小端和大端之间的区别已经够麻烦了。 - SDGator

4
曾经,计算机的字长通常是6位的倍数,因为计算机通常使用6位字符集,并不支持小写字母。
IBM为洛斯阿拉莫斯制造了一台高性能计算机STRETCH,它有64位的字长。它具有非常独特的功能,即计算机内存中的单个位可以直接寻址,这迫使字长必须是2的幂次方。它还有一个更广泛的字符集,允许包括数学符号(除了小写字母);它们在一个名为COLASL的特殊高级语言中使用。
当IBM推出非常流行的System/360大型机时,尽管它没有位地址寻址,但它仍然保留了8位字节,主要是为了允许以每个十进制数字4位打包的方式有效地存储。由于那台机器非常受欢迎,因此它非常有影响力,DEC的PDP-11计算机采用16位字长和8位字符设计。PDP-11也是第一台真正的小端机,它也非常受欢迎和有影响力。
但这不仅仅是因为追随潮流。8位字符允许小写文本,随着计算机变得更便宜,能够轻松地将它们用于文字处理变得更加重要。正如STRETCH需要具有2的幂次方大小的字长以便轻松寻址位一样,今天的计算机需要具有8的幂次方倍数的字长(恰好是2的3次幂)以便轻松寻址字符。
如果我们仍然使用6位字符,计算机的字长可能会是24、48或96位。

3
正如其他人所指出的,在早期,情况并不是那么清晰:单词有各种奇怪的大小。
但是推动标准化为8位字节也是由于存储芯片技术的发展。在早期,许多存储芯片以每个地址1位的方式组织。使用n个存储芯片(相应的地址线绑定在一起,每个芯片的单个数据位对n位单词的一个位进行贡献),可以构建n位单词的存储器。
随着存储芯片密度的提高,制造商在一个封装中放置了多个芯片。由于最常用的单词大小是8位的倍数,8位存储器特别受欢迎:这意味着它也是最便宜的。随着越来越多的体系结构加入到8位字节的阵营中,未使用8位字节的存储芯片的溢价越来越大。类似的论点解释了从8位到16位、16位到32位、32位到64位的转变。
您仍然可以设计一个具有24位存储器的系统,但是与使用32位存储器的类似设计相比,该存储器可能会更加昂贵。除非有一个非常好的理由坚持24位,否则大多数设计师在成本更低且功能更强大时会选择32位。

然后出现了DDR3...三通道内存。 - Will Bickford

1

Byte与字符编码有关,主要是西方世界的编码,因此为8位。 Word与编码无关,它与地址宽度有关,因此它的范围从4到80等等。


由于这是一个常见问题,也许您需要查看“如何撰写良好答案”的相关内容(http://stackoverflow.com/help/how-to-answer)。请添加一些参考资料,并扩展您的解释,使其优于现有的答案。 - Quintin Balsdon
西方语言使用8位(例如ISO 8859-1到15等)进行编码。即使是CJK也需要两个8位,即两个字节的编码(ISO 2202)。而单词宽度是指字节数,以方便计算。UTF-16、UTF-32分别为16位和32位,被称为2字节和4字节。这些都是为了方便理解而设定的,因为字节已经成为编码中常见的单位。 - user7178611

1

虽然可能不是唯一的原因,但我听说一个字节有8位的惯例是因为IBM在IBM System/360架构中这样设置的。


1
实际上,这取决于二进制转十六进制的转换有多容易以及最小的有用微控制器大小。一个半字节(4位)非常容易转换为单个十六进制数字(0-F)。但这只能给你15条指令。一个字节可以给你255个可能的指令,同时仍然很容易在脑中转换为十六进制。 - SDGator
一半字节!以前没听过这个词。 - Joel
@SDGator:在旧的18、24和36位架构中,人们使用八进制而不是十六进制,因为那个可以均匀地适配(这就是为什么C支持十进制、十六进制和八进制整数表达式)。你把惯例误认为是某种基本原则。 - dmckee --- ex-moderator kitten
1
我的猜测是这是由于二进制编码十进制(BCD)引起的,即一个字节中有两个十进制数字。会计师喜欢使用十进制数,因为它可以避免货币的四舍五入问题。 - starblue
@starblue:这个想法可能有点道理。 - dmckee --- ex-moderator kitten

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接