对于这个问题的解释主要分为两方面,一方面是1byte确实曾经可以不是8bit,另一方面是“什么样的历史因素”导致1byte现在是8bit。
感觉是做了一个语言(历史)学的工作。。 。
==========Part I============
byte的概念最早是用来表示一个“字”,也就是char。
quora上在对于这个问题有人贴了一个来自60s的5bit Telex,它可以表示26个英文字母。
但是它无法取法大小写,所以我们需要再加一个CapsLock,于是就有了6bits的byte。事实上,最早的商用机就是6bits的( IBM1401, Honeywell200, PDP8)。
6bits=64=54+10,恰好可以表示26个大小写字母+10个数字了,但是我们还需要若干常用字符。于是就有了许许多多更为复杂的编码系统,其中就包括IBM的EBCDIC(Extended binary coded decimal interchange code)和ASCII(American standard code for Information Interchange),它们都是8bit的编码系统,处理拉丁字母、数字和常用符号是绰绰有余了。其中ASCII是7bits+1parity,使得正确率大大提高(这可能是它后来广为流行的原因之一)。虽然如今那一位已经不再需要作为奇偶校验位而存在了。
为了表示更多的字符像是汉语、片假名、音标、颜文字、数学符合和满足人类的各种脑洞,本还有更多的编码系统。第一台迷你计算机有12bits,后来又有16bits的。
事实上,在C标准中,仅仅是要求1char≥8bits。也确实有不少对C/C++的实现是可以支持1byte=9,16,32,36bits的,实际上1byte到底有多大是作为一个常数CHAR_BIT写在limits.h里的。(我找到了我的CHAR_BIT~发现它确实等于8!)
===========Part II===============
虽然这看起来是百花齐放的局面,1byte是多少bits完全是依赖于硬件的。但IBM在1964年推出的IBM360 family对8bits的推广起到了非常大的意义;不过后来在home computer,personal computer市场中,ASCII打败了EBCDIC成为主流编码格式;但直到70s,1byte和8bits之间也并没有画上等号,tcp/ip协议中使用了octet的概念——1个IPv4的地址是4个octet——用来表示一个8bits的“字”,这就足以说明那时1byte=8bits还并不足以成为一条law。
主流厂商对于8bits硬件的支持和互联网的普及使得8bits的byte慢慢取代了其他的byte,也使得byte=octet。1byte=8bit逐渐成为了de facto standard。
所以后来在需要有新的字符集和编码系统的时候,人们不再选择扩大byte_size,而是选择用2个或4个byte,就是现在的utf-8和unicode等等。
1999年发布的IEC 60027-2中,写入了1octet=8bit;2008年发布的的iso/iec 80000-3中,写入了1byte=8bits。
所以这个“不成文的规定”就被作为正式的规定写下来了。就像是把一个词语写进词典,不过是对于过去的流行的总结罢了。我相信随着时间的流逝,一切都会改变。这篇回答仅仅能解释过去和现在,并不能解释未来~
=======================
看到有评论说在音频和视频采样的时候会用到不是8bits的byte,我觉得既然byte的大小已经被iso/iec承认了,那么在现代的机器上还会有用不一样的byte_size的嘛?这点我表示怀疑。
=======================
对这个问题蛮感兴趣的。。就去google了一发。想找个地方整理一下,所以就写在这里了,也不知道合不合适。因为我英语实在是太差了,好不容易艰难读了那么多段英文,如果不写下来就会忘记的,我不想忘记!