21

我不太了解 RAM 和 HDD 架构,或者电子设备如何处理大块内存,但这总是引发我的好奇心:为什么我们选择在计算机值中的最小元素停止在 8 位?

我的问题可能看起来很愚蠢,因为答案很明显,但我不太确定......

是因为 2^3 允许它在寻址内存时完美匹配吗?电子设备是否专门设计用于存储 8 位块?如果是,为什么不使用更宽泛的词?是因为它除以 32、64 和 128,所以处理器字可以被赋予其中几个字?这么小的空间有 256 的值是不是很方便?

你怎么看 ?

我的问题有点过于形而上学,但我想确保这只是历史原因,而不是技术或数学原因。

对于轶事,我也在考虑 ASCII 标准,其中大多数第一个字符对于 UTF-8 之类的东西是无用的,我也在尝试考虑一些更小更快的字符编码......

4

10 回答 10

12

从历史上看,字节的大小并不总是 8 位(就此而言,计算机也不必是二进制的,但非二进制计算在实践中的作用要少得多)。正是出于这个原因,IETF 和 ISO 标准经常使用术语octet - 他们不使用字节,因为他们不想假设它意味着 8 位而不是 8 位。

事实上,当字节被创造出来时,它被定义为一个 1-6 位的单位。整个历史中使用的字节大小包括 7、9、36 和具有可变大小字节的机器。

8 是商业成功的混合体,对于考虑它的人来说,这是一个足够方便的数字(这会相互影响),毫无疑问还有其他我完全不知道的原因。

您提到的 ASCII 标准假定为 7 位字节,并且基于早期的 6 位通信标准。


编辑:这可能值得添加,因为有些人坚持认为那些说字节总是八位字节的人,将字节与单词混淆了。

八位字节是一个8 位单位的名称(来自拉丁语中的八位)。如果您使用的是字节为 8 位的计算机(或更高抽象级别的编程语言),那么这很容易做到,否则您需要一些转换代码(或硬件覆盖)。八位字节的概念更多地出现在网络标准中而不是本地计算中,因为在架构中立的情况下,它允许创建可用于不同字节大小的机器之间通信的标准,因此它在 IETF 和 ISO 标准中的使用(顺便说一句,ISO/IEC 10646 使用八位字节,而 Unicode 标准使用字节本质上是-对后半部分有一些小的额外限制-相同的标准,尽管Unicode标准确实详细说明了它们按字节表示八位字节,即使字节在不同机器上的大小可能不同)。八位字节的概念之所以存在,正是因为 8 位字节很常见(因此选择使用它们作为此类标准的基础)但不是通用的(因此需要另一个词来避免歧义)。

从历史上看,一个字节是用来存储一个字符的大小,而这又建立在实践、标准和事实上的标准之上,这些实践、标准和事实上的标准早于计算机用于电传和其他通信方法的时间,也许从 1870 年的 Baudot 开始(我不知道) '不知道更早,但我愿意更正)。

这反映在 C 和 C++ 中,用于存储字节的单位被称为char其大小(以位为单位)由CHAR_BIT标准 limits.h 标头中定义。不同的机器会使用 5,6,7,8,9 或更多位来定义一个字符。当然,这些天我们将字符定义为 21 位,并使用不同的编码将它们存储在 8 位、16 位或 32 位单元中(以及其他大小的非 Unicode 授权方式,如 UTF-7),但从历史上看,这是原来如此。

在旨在跨机器更一致而不是反映机器架构的语言中,byte往往在语言中是固定的,如今这通常意味着它在语言中定义为 8 位。考虑到它们创建的历史时间点,并且大多数机器现在都有 8 位字节,这种区别在很大程度上是没有意义的,尽管在不同大小的机器上为这些语言实现编译器、运行时等并非不可能字节,只是不那么容易。

单词是给定计算机的“自然”大小。这不太明确定义,因为它会影响一些重叠的关注点,这些关注点通常会重合,但可能不会。机器上的大多数寄存器都是这个大小,但有些可能不是。最大的地址大小通常是一个字,尽管情况可能并非如此(Z80 有一个 8 位字节和一个 1 字节字,但允许一些寄存器加倍以提供一些 16 位支持,包括 16 位寻址)。

我们在这里再次看到 C 和 C++ 之间的区别,其中int根据字长定义,long并被定义为利用具有“长字”概念的处理器(如果存在),尽管在给定情况下可能与int. 最小值和最大值再次位于limits.h 标头中。(事实上​​,随着时间的推移,int可能被定义为小于自然字长,作为与其他地方常见的一致性的组合,减少整数数组的内存使用,以及可能其他我不关心的问题了解)。

Java 和 .NET 语言采用在所有架构中定义intlong固定的方法,并将处理差异作为运行时(尤其是 JITter)要处理的问题。值得注意的是,即使在 .NET 中,指针的大小(在不安全的代码中)也会根据体系结构而有所不同,成为底层字长,而不是语言强加的字长。

因此,八位字节、字节和字都是彼此非常独立的,尽管八位字节 == 字节和字的关系是一个整数字节(以及一个完整的二进制整数,如 2、4、8 等)是常见的今天。

于 2010-08-07T23:28:13.157 回答
9

并非所有字节都是 8 位。有些是 7,有些是 9,有些是其他值。8 很重要的原因是,在大多数现代计算机中,它是一个字节中的标准位数。正如尼古拉所提到的,位是实际的最小单位(单个二进制值,真或假)。

正如 Will 提到的,这篇文章http://en.wikipedia.org/wiki/Byte更详细地描述了字节及其可变大小的历史。

为什么 8、256 和其他数字很重要的一般原因是它们是 2 的幂,并且计算机使用以 2 为底(二进制)的交换机系统运行。

于 2010-08-07T23:11:35.287 回答
5

ASCII 编码需要 7 位,EBCDIC 需要 8 位。扩展的 ASCII 代码(如 ANSI 字符集)使用第 8 位来扩展字符集,包括图形、重音字符和其他符号。一些架构使用专有编码;一个很好的例子是 DEC PDP-10,它有一个 36 位机器字。这种架构上的一些操作系统使用打包编码,将 6 个字符存储在一个机器字中,用于各种目的,例如文件名。

到 1970 年代,DG Nova 和 DEC PDP-11 的成功,它们是 16 位架构和具有 32 位机器字的 IBM 大型机,将行业推向了默认的 8 位字符。1970 年代后期的 8 位微处理器就是在这种环境下开发的,这已成为事实上的标准,特别是当 UART、ROM 芯片和 FDC 芯片等现成的外围设备被构建为 8 位设备时。

到 1970 年代后期,业界将 8 位作为事实上的标准,而诸如带有 12 位机器字的 PDP-8 之类的体系结构变得有些边缘化(尽管 PDP-8 ISA 及其衍生产品仍然出现在嵌入式系统产品中)。随后是 16 位和 32 位微处理器设计,例如 Intel 80x86 和 MC68K 系列。

于 2010-08-07T23:43:56.883 回答
3

由于计算机使用二进制数,因此所有 2 的幂都很重要。

8 位数字能够表示 256 (2^8) 个不同的值,足以满足英语的所有字符和相当多的额外字符。这使得数字 8 和 256 非常重要。
许多 CPU(过去和现在仍然如此)以 8 位处理数据这一事实有很大帮助。

您可能听说过的其他两个重要的幂是 1024 (2^10=1k) 和 65536 (2^16=65k)。

于 2010-08-07T23:10:22.997 回答
3

计算机是建立在数字电子产品之上的,而数字电子产品是与国家合作的。一个片段可以有 2 种状态,1 或 0(如果电压高于某个电平,则为 1,否则为 0)。为了表示这种行为,引入了二进制系统(虽然没有引入,但被广泛接受)。

所以我们来到了这一点。位是二进制系统中最小的片段。它只能取 2 种状态,1 或 0,它代表了整个系统的原子片段。

为了让我们的生活更轻松,引入了字节(8 位)。打个比方,我们不以克表示重量,但这是重量的基本度量,但我们使用千克,因为它更易于使用和理解使用。一公斤是 1000 克,可以表示为 10 的 3 次方。所以当我们回到二进制系统并使用相同的幂时,我们得到 8(2 的 3 次方是 8)。这样做是因为在日常计算中仅使用位过于复杂。

坚持下去,所以在未来,当我们意识到 8 字节又太小并且使用起来变得复杂时,我们在幂上加了 +1(4 的幂的 2 是 16),然后 2^5 又是 32 ,依此类推,256 只是 2 的 8 次方。

所以你的答案是,由于计算机的体系结构,我们遵循二进制系统,并且我们提高表示的幂的值,得到一些我们每天可以简单处理的值,这就是你如何从一个比特到一个字节(8 位)等等!

(2, 4, 8 , 16, 32, 64, 128, 256 , 512, 1024 等) ( 2^x , x=1,2,3,4,5,6,7,8,9, 10 以此类推)

于 2010-08-07T23:35:01.650 回答
2

这里重要的数字是二进制01。您的所有其他问题都与此有关。

Claude ShannonGeorge Boole做了我们现在所说的信息论和布尔算术的基础工作。简而言之,这是一个数字转换的基础,只有能够表示0 OFF并且1 ON可以表示更复杂的信息,例如数字、逻辑和一张jpg照片。二进制是我们目前所知道的计算机的基础,但其他数基计算机或模拟计算机是完全可能的。

在人类十进制算术中,十的幂是有意义的。10、100、1000、10,000 每个似乎都很重要且有用。一旦你有了一台基于二进制的计算机,2 的幂同样变得很重要。2^8 = 256 对于字母、标点符号和控制字符就足够了。(更重要的是,2^7 足以容纳字母、标点符号和控制字符,2^8 足够容纳这些 ASCII 字符和校验位。)

于 2010-08-07T23:52:24.853 回答
1

我认为主要原因与 IBM PC 的原始设计有关。Intel 8080 CPU 是后来用于 IBM PC的 8086 的第一个前身。它有 8 位寄存器。因此,围绕 8 位隐喻开发了整个应用程序生态系统。为了保持向后兼容性,Intel 将所有后续架构设计为保留 8 位寄存器。因此,8086 和之后的所有 x86 CPU 都保留了它们的 8 位寄存器以实现向后兼容性,即使它们多年来添加了新的 16 位和 32 位寄存器。

我能想到的另一个原因是 8 位非常适合适合基本的拉丁字符集。您无法将其放入 4 位,但您可以放入 8 位。因此,您将获得整个 256 值 ASCII 字符集。它也是 2 的最小幂,您有足够的位可以容纳字符集。当然,现在大多数字符集实际上都是 16 位宽(即 Unicode)。

于 2010-08-07T23:12:37.157 回答
1

我们通常以 10 为底数,一个数字可以有十个不同的值之一。计算机技术基于可以打开或关闭的开关(微观)。如果其中一个代表一个数字,则该数字可以是 1 或 0。这是基数 2。

从那里可以看出,计算机使用由一系列 2 值数字组成的数字。

  • 1 个数字,2 个值
  • 2 位数字,4 个值
  • 3位数字,8个值等。

在设计处理器时,他们必须选择处理器将被优化以使用的尺寸。对于 CPU,这被认为是一个“词”。早期的 CPU 基于 4 位字长,不久之后 8 位(1 字节)。今天,CPU 主要设计为在 32 位和 64 位字上运行。但实际上,两个状态“开关”是为什么所有计算机数字都倾向于是 2 的幂。

于 2010-08-07T23:20:38.137 回答
1

Charles Petzold 写了一本有趣的书,名为Code,它正好涵盖了这个问题。参见第 15 章,字节和十六进制。

该章节的引述:

八位值是加法器、锁存器和数据选择器的输入,也是这些单元的输出。八位值也由开关定义并由灯泡显示,因此这些电路中的数据路径被称为8 位宽。但为什么是 8 位?为什么不是 6 或 7 或 9 或 10?

......真的没有理由必须以这种方式建造它。如果你愿意的话,八比特在当时似乎是一个方便的数量,一口很好的比特。

...有一段时间,一个字节仅意味着特定数据路径中的位数。但是到了 1960 年代中期。在 IBM 的 System/360(他们的大型商用计算机复合体)的开发中,这个词开始意味着一组 8 位。

... IBM 偏向于 8 位字节的一个原因是易于以称为 BCD 的格式存储数字。但正如我们将在后面的章节中看到的那样,很巧合的是,一个字节非常适合存储文本,因为世界上大多数书面语言(除了中文、日文和韩文中使用的表意文字)都可以用不到 256 个字节来表示人物。

于 2010-08-09T08:50:58.117 回答
0

历史原因,我想。8 是 2 的幂,2^2 是 4,而 2^4 = 16 对于大多数用途来说太少了,而 16(下一个 2 的幂)位硬件的出现要晚得多。

但我怀疑主要原因是他们有 8 位微处理器,然后是 16 位微处理器,它们的字可以很好地表示为 2 个八位字节,依此类推。您知道,历史遗留问题和向后兼容性等。

反对“缩小”的另一个同样实用的理由:如果我们使用 4 位作为一个单词,与 8 位相比,我们基本上只能获得一半的吞吐量。除了溢出更快

您总是可以在一个八位字节中压缩例如 0..15 范围内的 2 个数字……您只需手动提取它们。但是除非你有大量的数据集并排保存在内存中,否则这不值得。

于 2010-08-07T23:21:52.813 回答