我当时正在写一本关于计算机用二进制表示事物的小册子,有人问我一个问题 - 为什么 x86 架构使用 8 位字节? 为什么不能是其他尺寸?
对于这样的问题,我认为有两种可能:
◈这是出于历史原因,其他大小(例如 4、6 或 16 位)同样有效。
◈ 8位客观上是最好的选择,即使历史发展不同,我们仍然会使用8位字节。
◈1 和 2 的某种混合。
我对计算机历史并不是很着迷(我更喜欢与计算机打交道而不是阅读计算机文献),但我总是很好奇计算机事物是否有其今天的样子有内在原因,或者它们是否主要是结果历史偶然事件。 所以我们要谈谈计算机的历史。
作为历史偶然性的一个例子:DNS 有一个类字段,有 5 个可能的值(chaos、none 和any)。 对我来说,这是历史事故的一个明显例子 - 如果我们今天重新设计 DNS 而不必担心向后兼容性,我无法想象我们会以同样的方式定义类字段。 我不确定我们是否会使用类字段!
这篇文章没有明确的答案,但我在 .jvns.ca 上询问并发现了一些潜在的 8 位原因。 我认为答案是这些原因的综合。
字节和字有什么区别?
首先,本文中经常提到“字节”和“字”。 他们之间有什么区别? 我的理解是:
◈字节的大小是可以寻址的最小单位。 例如,在我的计算机上,程序可能具有一个字节的地址,然后是下一个字节的地址。
◈字大小是字节大小的倍数。 我多年来一直对此感到困惑,维基百科的定义非常模糊(“单词是特定处理器设计使用的自然数据单元”)。 我最初认为字大小与寄存器大小相同(x86-64 上为 64 位)。 但根据Intel架构手册的4.1节(《基本数据类型》),在x86上,虽然寄存器是64位,但一个字是16位。 所以我很困惑 - 在 x86 上,一个字是 16 位还是 64 位? 根据上下文它可以有不同的含义吗? 进展如何?
现在让我们讨论一下使用 8 位字节的一些可能原因!
原因一:将英文字母调整为1字节
维基百科文章指出,IBM /360 在 1964 年引入了 8 位字节。
在对该项目的管理人员 Fred 的视频采访中,他解释了原因。 以下是我抄写的一些内容:
… 6 位字节确实更适合科学计算,而 8 位字节更适合商业计算,并且每个字节都可以相互调整,以便两者可以相互使用。
所以这成为了一项行政决策,我根据 Jerry 的建议决定采用 8 位。
……
我在 IBM 职业生涯中做出的最重要的技术决定是为 360 选择 8 位。
我相信字符处理将变得比十进制数字更重要。
对文本使用 8 位字节是有意义的:26 等于 64,因此 6 位不足以表示小写字母、大写字母和符号。
为了使用8位字节,/360还引入了,即8位字符编码。
8 位历史上的下一个重要机器似乎是 Intel 8008,它是为计算机终端 (2200) 使用而设计的。 终端需要能够表示字母以及终端控制代码,因此使用 8 位字节对其有意义。 计算机历史博物馆的 2200 手册第 7 页说 2200 支持 ASCII(7 位)和(8 位)。
为什么 6 位字节在科学计算中更好?
我对这个评论“6 位字节在科学计算中更好”感到好奇。 以下是对吉恩的采访摘录:
我更喜欢 24 和 48,而不是 32 和 64,因为这会给我一个更合理的浮点系统。 因为在浮点运算中,当使用32位字长时,指数符号必须保持在8位,并且为了使其在数值范围内合理,必须一次调整4位而不是一点点。 因此,这会导致您比使用二进制移位更快地丢失一些信息。
我根本不明白这个评论 - 如果你使用 32 位字长,为什么指数必须是 8 位? 如果你愿意,为什么不能使用 9 或 10 位呢? 但这是我在快速搜索中找到的全部内容。
为什么大型机使用36位?
6 位字节的问题是许多大型机使用 36 位字长。 为什么? 维基百科的 36 位计算文章中有很好的解释:
在计算机出现之前,需要高精度科学和工程计算的领域使用的是十位机电计算器……这些计算器的每个数字都有一个专用的按键,操作者需要所有的手指,所以虽然一些专业计算器有更多的数字,这是一个实际限制。
因此,早期针对同一市场的二进制计算机常常使用36位字长。 这足以表示最多 10 位数字的正整数和负整数(最少应为 35 位数字)。
所以这个36位大小似乎是基于
,它等于 34.2。 嗯。
我想原因是在 20 世纪 50 年代,电脑非常昂贵。 因此,如果您希望您的计算机支持十位十进制数字,您可以将其设计为仅够用即可,而不需要更多。
如今计算机速度更快、更便宜,因此如果您出于某种原因想要表示 10 位十进制数字,您只需使用 64 位即可 - 浪费一点空间通常不是什么大问题。
还提到一些具有 36 位字长的计算机允许您选择字节大小 - 根据上下文,您可以使用 5 位、6 位、7 位或 8 位。
原因 2:使用二进制编码的十进制
20世纪60年代,有一种流行的整数编码,称为二进制编码十进制(-coded)(缩写为BCD),它将每个十进制数字编码为4位。
例如,如果您想对数字 1234 进行编码,则 BCD 格式将如下所示:
0001 0010 0011 0100
因此,如果您希望能够轻松使用二进制编码的十进制,您的字节大小应该是 4 位的倍数,例如 8 位!
为什么BCD如此受欢迎?
这种整数表示对我来说真的很奇怪——为什么不使用二进制来更有效地存储整数呢? 在早期的计算机中,效率非常重要!
我最好的猜测是,早期的计算机没有像我们今天这样的显示器,因此字节的内容直接映射到电灯开关。
这是来自 的 IBM 650 显示器的图像,带有一些明亮的灯光(CC BY-SA 3.0 许可证):
因此,如果您希望人们能够相对轻松地从二进制表示形式读取十进制数字,那么这就更有意义。 我认为 BCD 今天已经过时了,因为我们有显示器,我们的计算机可以将二进制表示的数字转换为十进制并显示它们。
另外,我想知道“quad”这个词(意思是“4位”)是否来自BCD。 在 BCD 上下文中,您通常指的是半字节(因为每个十进制数字为 4 位)。 所以有一个“4位数”这个词是有道理的,人们把4位数称为“四位数()”。 今天,“四”对我来说就像一个古老的词,而且我当然从来没有使用过它,除了作为轶事(这是一个有趣的词!)。 维基百科关于“四个”的文章支持这一理论:
“四位”用于描述 IBM 大型计算机上以压缩十进制格式 (BCD) 存储的位数。
有人提到 BCD 的另一个原因是用于财务计算。 如今,如果您想存储美元金额,通常只需使用整数的分数,然后在需要美元部分时除以 100。 没什么大不了的,分的很快。 但显然,在 20 世纪 70 年代,用二进制表示的整数除以 100 的速度非常慢,因此值得重新设计如何表示整数以避免除以 100。
好了,关于 BCD 的内容就这些了。
原因3:8是2的幂?
很多人说CPU字节大小是2的幂很重要。我无法判断这是真是假,而且我对“计算机使用二进制,所以2的幂很好”这句话不满意解释。 这看起来很有道理,但我想更深入地挖掘一下。 从历史上看,确实有许多机器的字节大小不是 2 的幂,例如(摘自 Stack 上的复古计算部分的这篇文章):
◈Cyber 180主机使用6位字节
◈ 1100/2200系列使用36位字长
◈PDP-8是12位计算机
我听说 2 的幂很好,但我仍然不明白的一些原因:
◈一个字中的每一位都需要一个总线,并且您希望总线的数量是 2 的幂(为什么?)
◈很多电路逻辑很容易出现分而治之的技术(我需要一个例子来理解这一点)
对我来说更有意义的原因是:
◈它使得设计测量“这条线上发送的8位”并分别基于减半操作的“时钟分频器”变得更容易 - 您可以将3个减半时钟分频器串联起来。 Poly..co.uk 告诉我这一点,他们制作了这个非常酷的交叉模拟器,展示了这些交叉是如何工作的。 这个网站()有很多其他示例电路,看起来是制作电路模拟器的一种非常酷的方法。
◈如果你有一条指令清除一个字节中的特定位,那么如果你的字节大小是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 (1974) 是第一个 x86 处理器 8086 (1976) 的前身。 看起来 8080 和 8086 很流行,这就是我们现代 x86 计算机的来源。
我认为这里存在一个“如果它很好,就不要碰它”的问题——我假设 8 位功能足够好,英特尔认为没有必要改变设计。 如果保留相同的 8 位字节,那么您可以重用更多的指令集。
另外,在 20 世纪 80 年代左右,我们开始使用 TCP 等网络协议,它使用 8 位字节(通常称为“八位字节”),如果您要实现网络协议,您可能希望使用 8 位字节。
就是这样!
在我看来,8位字节的主要原因是:
◈许多早期的计算机公司都位于美国,而美国使用最广泛的语言是英语。
◈这些人希望计算机擅长文本处理
◈字节大小通常越小越好
◈7位是可以容纳所有英文字母和标点符号的最小尺寸
◈8 比 7 好(因为它是 2 的幂)
◈一旦您拥有成功实现的流行 8 位计算机,您希望保持相同的设计以实现兼容性。
有人指出,1962 年书的第 65 页谈到了 IBM 选择 8 位字节的原因,基本上说的是同一件事:
1. 其 256 个字符的完整容量被认为足以满足绝大多数应用程序的需要。
2. 在此容量内,单个字符由单个字节表示,因此任何特定记录的长度不会根据该记录中的字符而变化。
3. 8位字节在存储空间方面是相当经济的。
4、对于纯粹的数值工作,一个十进制数只需要4位来表示,两个这样的4位字节就可以打包成一个8位字节。 尽管这种数字数据包装不是必需的,但为了速度和存储效率,这是一种常见的做法。 严格来说,4 位字节属于不同的代码,但与 4 位和 8 位方案相比,它们的简单性导致机器设计更简单,寻址逻辑更清晰。
5. 4 和 8 位的字节大小(2 的幂)允许计算机设计者利用二进制寻址和位级索引的功能(参见第 4 章和第 5 章)。
总体而言,如果您在英语国家设计二进制计算机,选择 8 位字节似乎是一个非常自然的选择。
最近很多小伙伴找我要一些程序员必备资料,于是我翻出了压箱底的宝藏,免费分享给大家!
扫描海报二维码免费获取。