为啥位数总是(?)是二的幂? [关闭]
Posted
技术标签:
【中文标题】为啥位数总是(?)是二的幂? [关闭]【英文标题】:Why is number of bits always(?) a power of two? [closed]为什么位数总是(?)是二的幂? [关闭] 【发布时间】:2010-12-09 01:47:06 【问题描述】:我们有 8 位、16 位、32 位和 64 位硬件架构和操作系统。但不是 42 位或 69 位的。
为什么?是使 2^n 位成为更好选择的基本因素,还是仅仅与现有系统兼容? (一个64位的寄存器可以保存两个32位的指针,或者一个32位的数据单元可以保存4个字节,显然很方便。)
【问题讨论】:
从回答中可以看出,这种情况还是比较新的。 它并不总是 2 的幂。Exotic architectures the standards committees care about, What platforms have something other than 8-bit char? 【参考方案1】:可敬的 PDP-10 是 36 位。
【讨论】:
我看不出指出一个特定的架构如何回答“为什么”这个问题。 @Joonas 当时,字符大小为 6 位,因此 36 (6 * 6) 是有意义的......这和其他见解在***文章 Voytek Jarnot 中为我们找到,在这篇文章。 大多数 PDP 都是奇怪的数字:- village.org/pdp11/faq.pages/WhatPDP.html 这是相关的,因为它反驳了最初的前提。 1953 BESK 有 40 位。 en.wikipedia.org/wiki/BESKpbase.com/jakobe/besk_remains 与当前的问题完全无关,但想想 PDP-10:当我第一次开始使用那台计算机时,我们有 300 波特的调制解调器。然后有一天我们得到了 1200 波特的调制解调器。我记得他们的速度给我留下了深刻的印象。我对一个朋友说:“哇,这东西打印出来的速度比你看的还快!!”【参考方案2】:这主要是一个传统问题。它甚至不总是正确的。例如,处理器中的浮点单元(即使是当代的)具有 80 位寄存器。而且没有什么会迫使我们使用 8 位字节而不是 13 位字节。
有时这有数学推理。例如,如果您决定有一个 N 位字节并想要进行整数乘法,则您需要正好 2N 位来存储结果。然后你还想加/减/乘那些 2N 位整数,现在你需要 2N 位通用寄存器来存储加法/减法结果和 4N 位寄存器来存储乘法结果。
【讨论】:
我们的一些产品基于具有 40 位长度的 TI DSP。 focus.ti.com/docs/toolsw/folders/print/sprc122.html【参考方案3】:http://en.wikipedia.org/wiki/Word_%28computer_architecture%29#Word_size_choice
不同数量的内存用于存储具有不同精度的数据值。常用的大小通常是地址解析单位(字节或字)的 2 倍的幂。将数组中项目的索引转换为项目的地址只需要移位操作而不是乘法。在某些情况下,这种关系也可以避免使用除法运算。因此,大多数现代计算机设计的字大小(和其他操作数大小)是字节大小的 2 倍。
【讨论】:
这解释了为什么具有 8 位最小可寻址单元的机器使用 16、32... 总线宽度,但没有解释 8 位字节的普遍性。 存在一个 8 位字节,因为 7 位足以将英文编码为 ASCII,而第 8 位可用于奇偶校验。 6 位足以编码拉丁字母 + 数字(留下一个空的 3/4-of-a-byte 和另一个符号)。一些早期的文本编码甚至是 5 位。【参考方案4】:相关,但可能不是原因,我听说8 bits in a byte 的约定是因为它是 IBM 装配 IBM System/360 架构的方式。
【讨论】:
真的,它归结为从二进制到十六进制的转换有多容易,以及最小的有用微控制器尺寸。半字节(4 位)很容易转换为单个十六进制数字(0-F)。但这只会给你 15 条指令。一个字节可以为您提供 255 条可能的指令,同时仍然很容易在您的脑海中转换为十六进制。 一小口!以前没听说过。 @SDGator:在旧的 18、24 和 36 位架构上,人们使用八进制而不是十六进制,因为 适合均匀(这就是为什么 c 支持十进制、十六进制、和八进制整数表达式)。你把约定误认为是基本的东西。 我的猜测是由于二进制编码十进制 (BCD),即一个字节中有两个十进制数字。豆类计数器喜欢十进制数字,它避免了钱的四舍五入问题。 @starblue:这个想法可能有些道理。【参考方案5】:您的内存系统想要成为字节倍数,这使得您的缓存想要成为字节倍数,这使得您的整个系统想要成为字节倍数。
作为硬件设计师,您通常希望将 CPU 设计为某种类型的字节边界,即 8 的倍数。否则,您要么必须在 49 位系统中添加许多笨拙的电路以使其能够使用 mod -8 位,或者您最终会忽略额外的位,在这种情况下这是一种浪费,除非您需要额外的位来执行指令,而这在 16 位或更宽的系统上绝不会出现这种情况。
【讨论】:
这只是您将 8 位字节视为基础。它们不是,使用 18、24 和 36 位机器字的系统过去很常见并且不会给硬件设计人员带来任何问题。 我指的是两个不同的问题。只要您有足够的位来覆盖您的指令集或机器字,就可以了。这些不需要是字节倍数。满足该要求后,您需要担心内存寻址。通常您以字节、双字或 oword 为单位访问内存。如果您有一个非字节多架构,您将需要某种翻译器来访问内存和缓存以获取额外的位,并且寻址数学变得很奇怪。我想我的论点仍然归结为惯例,因为您总是可以定义一个字节+x 寻址方案。 没有。使用不可被八位整除的字不和从未访问八位字节内存的机器。购买以 8 位字节访问的内存很容易这一事实是结果,而不是原因。八位字节没有任何基础。什么都没有。 你是对的......关于 8 位字节没有什么基本的。你可以设计任何你想要的东西。但是,没有任何商业公司会花费这些美元将无法正常与外围设备、内存等通信的产品推向市场的根本原因。现在它几乎是惯例,并且没有合理的技术理由来搞砸用它。小端与大端已经够糟糕了。【参考方案6】:在某种程度上,这是一个寻址问题。拥有 N 位地址最多允许您寻址 2^N 位内存,而硬件设计人员更喜欢充分利用这种能力。因此,您可以使用 3 位来寻址 8 位总线等...
【讨论】:
这对我来说最有意义。具有非 2 次幂的位数会浪费地址状态。【参考方案7】:一个常见的原因是您可以用二进制对您的位进行编号。这在很多情况下都很有用。例如,在位移或旋转操作中。您可以将 16 位值旋转 0 到 15 位。旋转超过 16 位的尝试也很简单:这相当于旋转超过 0 位。并且旋转超过 1027 位等于旋转超过 3 位。一般来说,宽度为 W 的寄存器在 N 位上的循环等于在 N 模 W 上的循环,当 W 是 2 的幂时,“模 W”运算是微不足道的。
【讨论】:
【参考方案8】:我值得信赖的旧 HP 32S 计算器是 12 位的。
【讨论】:
【参考方案9】:因为为地址保留的空间始终是固定位数。 一旦你定义了固定地址(或指针)的大小,你就想充分利用它,所以你必须使用它的所有值,直到它可以存储的最大数字。您可以从位的倍数(0 或 1)中获得的最大数始终是 2 的幂
【讨论】:
【参考方案10】:也许你可以在这里找到一些东西:Binary_numeral_system
【讨论】:
【参考方案11】:ICL 1900 都是 24 位(字)。打赌没有多少人记得这些。你会吗??
【讨论】:
对不起,我的意思是当它模拟 1900 范围时,一个真正的 24 位字机。【参考方案12】:80186、8086、8088 和 80286 及更高版本处理器上的“实模式”使用 20 位分段内存寻址系统。 80286 有 24 条本机地址线,然后 386 和后来的有 32 或 64 条。
【讨论】:
该死的近和远指针。管理记忆的方法太粗暴了。 近/远的东西很糟糕,但考虑到可用的硬件设计和历史限制,选择是有限的。 我认为,英特尔不惜一切代价想要向后兼容这一事实过于严格。这就是摩托罗拉和 Power PC 能够以卓越但不兼容的设计突飞猛进的原因。 Mac 只有在其架构/指令集被认为足够强大以供其计算机使用时才切换到英特尔。现在,请注意,这是从技术角度来看的。从商业角度来看,我认为他们采取了正确的举措来保持重要的市场份额。 @JesseC.Slicer Apple 切换的来源,因为英特尔拥有足够强大的指令集?我的印象是他们别无选择,IBM 并没有真正在台式机/笔记本电脑领域使用 PowerPC(因此没有 Powerbook G5),x86 是唯一采用适当芯片的其他架构。最初的几台 x86 Mac 仍然是 32 位的,因此它们没有任何 64 位 ISA 改进。【参考方案13】:另一个反例:PIC16C8X 系列微控制器具有 14 位宽的指令集。
【讨论】:
你秒杀我!值得一提的是,这是一个哈佛架构处理器,14位字用于指令,而数据存储器是标准的8位字节。【参考方案14】:正如其他人所指出的,在早期,事情并没有那么明确:词的大小各不相同。
但内存芯片技术也推动了 8 位字节标准化的推动。在早期,许多存储芯片被组织为每个地址 1 位。 n 位字的内存是通过使用 n 组内存芯片构成的(相应的地址线连接在一起,每个芯片的单个数据位贡献 n 位字的一位)。
随着内存芯片密度越来越高,制造商将多个芯片封装在一个封装中。因为最流行的字长是 8 位的倍数,所以 8 位内存特别受欢迎:这意味着它也是最便宜的。随着越来越多的架构加入 8 位字节的潮流,不使用 8 位字节的内存芯片的价格溢价越来越高。类似的论点解释了从 8->16、16->32、32->64 的移动。
您仍然可以设计具有 24 位内存的系统,但该内存可能会比使用 32 位内存的类似设计贵得多。除非有充分的理由坚持使用 24 位,否则大多数设计师会选择 32 位,因为它既便宜又功能强大。
【讨论】:
随之而来的是 DDR3...三通道内存。【参考方案15】:我们有,看看 PIC 微控制器。
【讨论】:
【参考方案16】:许多(大多数?)早期的前置微处理器 CPU 的每个字的位数不是 2 的幂。
特别是,Seymour Cray 和他的团队构建了许多具有非二次幂字大小和地址大小(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 位前端总线的处理器(例如 Intel Pentium 和 AMD K5 等)或具有4 位宽总线(LPC 总线)。
【讨论】:
【参考方案17】:曾经,计算机字长往往是 6 位的倍数,因为计算机通常使用 6 位字符集,不支持小写字母。
IBM 为洛斯阿拉莫斯制造了一台高性能计算机 STRETCH,它有一个 64 位字。它有一个不寻常的功能,即可以直接寻址计算机内存中的各个位,这迫使字长为 2 的幂。它还有一个更扩展的字符集,允许包含数学符号(除了小写字母);它们被用于一种名为 COLASL 的特殊高级语言。
当 IBM 推出非常流行的 System/360 大型机时,尽管它没有位寻址,但它保留了 8 位字节,主要是为了允许以四位到十进制数字有效存储压缩十进制数量。因为那台机器很受欢迎,影响很大,DEC 的 PDP-11 计算机是用 16 位字和 8 位字符设计的。 PDP-11也是第一台真正意义上的小端机器,也非常流行和有影响力。
但这不仅仅是因为追随时尚。 8 位字符允许使用小写文本,并且随着计算机变得更便宜,能够轻松地使用它们进行文字处理受到重视。正如 STRETCH 需要一个以位为单位的 2 次幂的字以允许轻松寻址位一样,今天的计算机需要一个字是 8 的 2 的倍数(恰好是2 的三次方本身),以便轻松处理字符。
如果我们仍然使用 6 位字符,计算机将倾向于使用 24、48 或 96 位字。
【讨论】:
【参考方案18】:字节与大多数西方世界的字符编码有关,因此是 8 位。 Word 与编码无关,它与地址宽度有关,因此它从 4 到 80 等不等
【讨论】:
由于这是一个流行的问题,也许您可以查看how to write a good answer。请添加一些参考资料并将您的解释扩大到优于现有答案的程度。 西方语言覆盖了 8 位(比如 iso 8859-1,到 15 位左右。甚至 CJK 也用两个 8 位编码,即两个字节用于编码(iso 2202)。而宽度我会为方便起见,word被称为字节数。UTF-16,32是16位,32位被称为2字节和4字节。这一切都是为了方便理解,因为字节已经变得更熟悉编码了。以上是关于为啥位数总是(?)是二的幂? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章