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