从历史上看,字节的大小并不总是 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 语言采用将 int 和 long 定义为在所有架构中固定的方法,并将处理差异作为运行时(尤其是 JITter)要处理的问题。值得注意的是,即使在 .NET 中,指针的大小(在不安全的代码中)也会根据体系结构而有所不同,成为底层字长,而不是语言强加的字长。
因此,八位字节、字节和字都是彼此非常独立的,尽管八位字节 == 字节和字的关系是一个整数字节(以及一个完整的二进制整数,如 2、4、8 等)。 ) 在今天很常见。