我一直在写一本关于计算机如何用二进制表示事物的杂志,我问过几次的一个问题是——为什么 x86 架构使用 8 位字节?为什么不是其他尺寸?
对于这样的问题,我认为有两种选择:
- 这是一个历史事故,其他大小(如 4 位或 6 位或 16 位)也可以
- 出于某种原因,8 位客观上是最佳选择,即使历史发生了不同的变化,我们仍然会使用 8 位字节
- 1和2的一些混合
我不是很了解计算机历史(我更喜欢使用计算机,而不是喜欢阅读计算机),但我总是很好奇是否有一个重要的原因可以解释为什么计算机会成为今天的样子,或者它是否主要是历史事故。因此,我们将讨论一些计算机历史。
举一个历史事故的例子:DNS 有一个class
字段,它有 5 个可能的值(“internet”、“chaos”、“hesiod”、“none”和“any”)。对我来说,这是历史事故的一个明显例子——我无法想象如果我们今天可以重新设计 DNS 而不必担心向后兼容性,我们会以相同的方式定义类字段。我不确定我们是否会使用类字段!
这篇文章中没有任何明确的答案,但我在 Mastodon 上询问过,这里是我发现的 8 位字节的一些潜在原因。我认为答案是这些原因的某种组合。
一个字节和一个字有什么区别?
首先,这篇文章经常谈论“字节”和“单词”。一个字节和一个字有什么区别?我的理解是:
- 字节大小是您可以寻址的最小单位。例如在我机器上的程序中
0x20aa87c68
可能是一个字节的地址,那么0x20aa87c69
就是下一个字节的地址。 - 字长是 CPU 寄存器的大小。例如我的寄存器是 64 位的。您进行计算的任何数字都需要放入寄存器中,因此这也是您将看到的整数/浮点数的典型大小。
在今天的笔记本电脑/台式电脑/服务器上,字节基本上总是 8 位,字是 64 位。
我认为这个字长的定义出于某种原因在技术上可能是不正确的,但我就是这么想的,到目前为止它并没有让我误入歧途。
现在让我们谈谈我们使用8位字节的一些可能原因!
原因一:为了把英文字母放在1个字节中
这篇维基百科文章说 IBM System/360 在 1964 年引入了 8 位字节。
这是对 Fred Brooks(项目负责人)的视频采访,其中谈到了原因。我在这里转录了一些:
……六位字节 [确实] 更适合科学计算,而 8 位字节确实更适合商业计算,并且每个字节都可以为另一个字节工作。所以它归结为一个行政决定,我决定采用 8 位字节,Jerry 的提议。
[……]
在我的 IBM 职业生涯中,我最重要的技术决定是为 360 使用 8 位字节。基于此,我相信字符处理将变得比十进制数字更重要。
8 位字节更适合文本处理是有道理的:2^6 是 64,因此 6 位字节对于小写字母、大写字母和符号来说是不够的。
为了配合 8 位字节,System/360 还引入了EBCDIC编码,这是一种 8 位字符编码。
看起来 8 位字节历史上的下一个重要机器是Intel 8008 ,它被构建用于计算机终端(Datapoint 2200)。终端需要能够表示字母以及终端控制代码,因此使用 8 位字节对它们来说是有意义的。计算机历史博物馆的 Datapoint 2200 手册第 7 页说 Datapoint 2200 支持 ASCII(7 位)和 EBCDIC(8 位)。
为什么 6 位字节更适合科学计算?
我对 6 位字节更适合科学计算的评论感到好奇。这是来自 Gene Amdahl 的这次采访的引述:
我想把它变成 24 和 48 而不是 32 和 64,因为这会给我一个更合理的浮点系统,因为在浮点中,使用 32 位字,你必须保持指数正好指数符号为 8 位,并且为了使其在它可以跨越的数字范围方面合理,您必须调整 4 位而不是一位。因此,与二进制移位相比,它会导致您更快地丢失一些信息
我完全不明白这个评论——如果你使用 32 位字长,为什么指数必须是 8 位?如果你愿意,为什么不能使用 9 位或 10 位?但这是我在快速搜索中所能找到的所有内容。
为什么大型机使用 36 位?
还与 6 位字节有关:许多大型机使用 36 位字大小。为什么?有人指出维基百科关于36 位计算的文章中有很好的解释:
在引入计算机之前,精密科学和工程计算的最先进技术是十位数的电动机械计算器……这些计算器的每个数字都有一列键,并且操作员经过培训可以使用所有手指输入数字时,虽然一些专门的计算器有更多列,但十个是实际限制
因此,针对同一市场的早期二进制计算机通常使用 36 位字长。这足以将正整数和负整数表示为十进制数字的精度(最少 35 位)
所以这个 36 位的东西似乎是基于 log_2(20000000000) 是 34.2 的事实。嗯。
我猜这是因为在 50 年代,电脑非常昂贵。所以如果你想让你的计算机支持十位十进制数字,你会设计成它有足够的位来做到这一点,而不是更多。
今天的计算机更快更便宜,所以如果你出于某种原因想要表示十位十进制数字,你可以只使用 64 位——浪费一点空间通常没什么大不了的。
原因 2:与二进制编码的十进制配合使用
在 60 年代,有一种流行的整数编码称为二进制编码十进制(或简称BCD ),它将每个十进制数字编码为 4 位。
例如,如果你想对数字 1234 进行编码,在 BCD 中将类似于:
0001 0010 0011 0100
所以如果你想能够轻松地使用二进制编码的十进制,你的字节大小应该是 4 位的倍数,比如 8 位!
为什么 BCD 流行?
这种整数表示对我来说真的很奇怪——为什么不直接使用二进制,这是一种更有效的整数存储方式?效率在早期的计算机中真的很重要!
我最好的猜测是为什么早期的计算机没有像我们现在这样的显示器,所以一个字节的内容直接映射到开/关灯。
这是来自 Wikipedia 的一张 IBM 650 的图片,其显示屏上有一些灯( CC BY-SA 3.0 ):
因此,如果您希望人们能够相对轻松地从二进制表示形式中读出十进制数,这就更有意义了。我认为今天 BCD 已经过时了,因为我们有显示器,我们的计算机可以为我们将二进制表示的数字转换为十进制并显示它们。
另外,我想知道 BCD 是否是 4 位的术语“半字节”的来源——在 BCD 的上下文中,你最终指的是很多半字节(因为每个数字都是 4 位)。所以用一个词来表示“4 位”是有意义的,人们称 4 位为半字节。今天,“蚕食”对我来说感觉像是一个古老的术语——我绝对从未使用过它,除非是作为一个有趣的事实(这是一个非常有趣的词!)。
好的,关于 BCD 就够了。
理由3:8是2的幂?
很多人说 CPU 的字节大小是 2 的幂很重要。不过我不知道这是不是真的,我对“计算机使用二进制所以幂是”的解释不满意2 很好”。这似乎很有道理,但我想更深入地挖掘。从历史上看,肯定有很多机器使用的字节大小不是 2 的幂,例如(来自这个复古计算堆栈交换线程):
- Cyber 180 大型机使用 6 位字节
- Univac 1100 / 2200 系列使用 36 位字长
- PDP-8 是一个 12 位机器
我听说 2 的幂是好的但我还不明白的一些原因:
- 一个字中的每一位都需要一条总线,而你希望总线的数量是 2 的幂(为什么?)
- 许多电路逻辑容易受到分而治之技术的影响(我想我需要一个例子来理解这一点)
对我来说更有意义的原因:
- 可以更轻松地设计基于减半工作的“8 位已发送到此线路”的时钟分频器——您可以串联 3 个减半时钟分频器。 Graham Sutherland告诉我这件事,并制作了这个非常酷的时钟分频器模拟器,展示了这些时钟分频器的外观。该站点 (Falstad) 还有许多其他示例电路,这似乎是制作电路模拟器的一种非常酷的方法。
- 如果您有一条指令将一个字节中的特定位清零,那么如果您的字节大小为 8 (2^3),则您可以仅使用指令的 3 位来指示哪个位。 x86 似乎没有这样做,但Z80 的位测试指令可以。
- 有人提到有些处理器使用进位先行加法器,它们以 4 位为一组工作。从一些快速的谷歌搜索来看,似乎有各种各样的加法器电路。
- 位图:您计算机的内存被组织成页面(通常大小为 2^n)。它需要跟踪每个页面是否空闲。操作系统使用位图来执行此操作,其中每个位对应一个页面,并且是 0 或 1,具体取决于该页面是否空闲。如果您有一个 9 位字节,则需要除以 9 才能在位图中找到您要查找的页面。除以 9 比除以 8 慢,因为除以 2 的幂总是最快的。
我可能把其中一些解释搞得一团糟:我已经远远超出了我的舒适区。让我们继续。
原因 4:小字节大小很好
您可能想知道——好吧,如果 8 位字节比 4 位字节好,为什么不继续增加字节大小呢?我们可以有 16 位字节!
保持字节大小小的几个原因:
- 这是一种空间浪费——一个字节是你可以寻址的最小单位,如果你的计算机存储了大量的 ASCII 文本(只需要 7 位),那么为每个文本分配 12 或 16 位将是一个相当大的浪费当您可以使用 8 位时,字符。
- 随着字节变大,您的 CPU 需要变得更复杂。例如,每位需要一条总线。所以我想越简单越好。
我对 CPU 体系结构的理解非常不稳定,所以我就此打住。不过,“这是浪费空间”的理由对我来说很有说服力。
理由五:兼容性
Intel 8008(从 1972 年开始)是 8080(从 1974 年开始)的前身,8080(从 1976 年开始)是第一个 x86 处理器。 8080 和 8086 似乎真的很流行,这就是我们获得现代 x86 计算机的地方。
我认为这里有一个“如果它没有坏就不要修复它”的问题——我假设 8 位字节运行良好,所以英特尔认为没有必要改变设计。如果保留相同的 8 位字节,则可以重用更多的指令集。
就这样!
在我看来,8 位字节的主要原因是:
- 很多早期的电脑公司都是美国的,美国最常用的语言是英语
- 那些人希望计算机擅长文本处理
- 较小的字节大小通常更好
- 7位是您可以容纳所有英文字符+标点符号的最小尺寸
- 8 比 7 好(因为它是 2 的幂,而 2 的幂有一些优势,因为计算机以 2 为底)
- 一旦您拥有运行良好的流行 8 位计算机,您希望保持相同的设计以实现兼容性
原文: https://jvns.ca/blog/2023/03/06/possible-reasons-8-bit-bytes/