【问题标题】:Why are 8 and 256 such important numbers in computer sciences?为什么 8 和 256 在计算机科学中如此重要?
【发布时间】:2011-03-26 19:59:52
【问题描述】:

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

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

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

你怎么看?

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

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

【问题讨论】:

标签: math memory history processor ram


【解决方案1】:

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

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

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

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


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

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

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

这反映在 C 和 C++ 中,用于存储字节的单元称为 char,其大小由标准 limits.h 标头中的 CHAR_BIT 定义。不同的机器会使用 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 等)。 ) 在今天很常见。

【讨论】:

    【解决方案2】:

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

    那一章的引述:

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

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

    ...有一段时间,一个字节意味着简单 特定的位数 数据路径。但是到了 1960 年代中期。在 与发展的联系 IBM 的 System/360(他们的大型综合体 商用计算机),这个词来了 表示一组 8 位。

    ... IBM 青睐的原因之一 8 位字节便于存储 BCD 格式的数字。 但是正如我们将在后面的章节中看到的那样,一个字节很巧合 存储文本的理想选择,因为大多数 世界各地的书面语言 (表意文字除外 用于中文、日文和韩文) 可以用少于 256 个来表示 字符。

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        【解决方案4】:

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

        到 1970 年代,D.G. 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 系列。

        【讨论】:

          【解决方案5】:

          计算机是建立在数字电子产品之上的,而数字电子产品则与状态协同工作。一个片段可以有 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 等)

          【讨论】:

            【解决方案6】:

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

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

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

            【讨论】:

            • 维基百科谈到了为什么一个字节与 8 位相关联 - 并非总是如此,也并非每台计算机都总是如此。 en.wikipedia.org/wiki/Byte
            • @Nikola:正如维基百科文章 Will 发布的描述,字节并不总是 8 位。在大多数现代标准 PC(甚至那些 Mac :P)上,使用 8 位字节。实际字节大小具有更广泛的历史范围,尽管我会说大多数在每字节 6 到 16 位之间。不过,你说得对,最小的元素有点。
            • @Nikola,其他位大小并没有失败,只是不如 8 好,然后就消失了。羚羊被吃掉是因为它没有牧羊人那么快而被吃掉,而另一种是因为它试图先吃老虎而被吃掉。后者失败了,前者不够成功。 7 位字节不够成功。如果我们现在从头开始构建,我们可能会拥有更大的 64 位大小,并且不必处理不匹配的字节和单词。
            • @Nikola Markezic:“字节总是 8 位。”,不,这是不正确的。字节大小可能会因芯片、操作系统或架构而异。个人看过一本on byte为4 bits的芯片的编程手册,听说过其他非8 bit字节的芯片。
            • 不要将字节大小的八位字节大小误认为字的大小和字节的大小。在今天的大多数情况下,一个字不是一个字节。自 1980 年代以来,我还没有使用过一个单词与一个字节相同的机器(除非你算上小工具中的微控制器)。
            【解决方案7】:

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

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

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

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

            【讨论】:

              【解决方案8】:

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

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

              【讨论】:

              • 你确定8080是用在PC上的吗?我很确定它是第一个 IBM PC CPU 的 8086(以及成本更低的 8088)。
              • 来自 Wikipedia 的更多有趣文档:“8086 以源代码兼容的形式销售,其设计目的是使 8008、8080 或 8085 的汇编语言可以自动转换为等效(次优)8086 源代码, 几乎没有手工编辑”en.wikipedia.org/wiki/Intel_8086
              • 60 年代使用了八位字节。 IBM System/360 可能是第一个。
              • 一开始,互联网是一个 7 位系统。 ietf.org/rfc/rfc2045.txt “基于 RFC 821/822 的邮件系统的显着限制之一是它们将电子邮件消息的内容限制为 7 位 US-ASCII 的相对较短的行(例如 1000 个字符或更少 [RFC-821]) 。”所以我们使用了,它是什么,ROT-13 还是 UUE?编码更大的数据值。啊,美好的时光。
              • @ysap,你是对的,8086 是 16 位输入,16 位寄存器,16 位输出。 8088 是 8 位输入、16 位寄存器和 8 位输出。所以 8088 只需要 2 个时钟周期来加载一个寄存器。制造起来要便宜得多,至少他们声称是这样。
              【解决方案9】:

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

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

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

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

              【讨论】:

                【解决方案10】:

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

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

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

                【讨论】:

                  猜你喜欢
                  • 2011-06-02
                  • 2010-09-16
                  • 2018-04-25
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2010-10-05
                  • 2017-07-07
                  相关资源
                  最近更新 更多