波特率9600每秒的传输字节_电脑里的1kB到底是1000字节还是1024字节?

前两天早上上学,Vita哥哥忽然问我:爸爸你知道吗,1kB可以是1000字节,但有时也可以是1024字节哦。

我忽然想起来,他最近在看一本叫做《嘭!编程超有趣》的书,我翻了一下,里面确实有这个内容:

ebba352cdcc501e0897502eced75d373.png

右上角小贴士:为什么只有k是小写呢?

答案:因为大写K已经代表温度(开尔文)了

后来他又问我,为什么1kB有时候是1024字节,有时候是1000字节呢?这个问题很有意思,而且不太容易答对。说起这个1024,稍早一些接触计算机的人恐怕都曾被它搞糊涂过,现在10月24日还变成了“程序员节”,可见这个数字对计算机人士来说多么重要呢。

计算机业界一直以来都习惯用1024作为数据容量单位前缀的倍数,比如1kB=1024B、1MB=1024kB、1GB=1024MB……这件事我估计大部分人还是知道的,比如在Windows里面查看硬盘容量,你会发现字节数换算成GB之后并不是一个整倍数:

7f5cde614103dfec765277ea06b29a00.png

其实这个107GB就是按照1024倍的关系算出来的,也就是把字节数除以1024的3次方得到的:

afeac18dcae401044fabe5b80d97a293.png

然而诡异的是,硬盘(也包括U盘、闪存卡等等)厂商标的那个容量,却是按照1000倍的关系计算的。也就是说,你买了一块500GB的硬盘,它的实际容量是500,000,000,000字节,如果你按照1024倍换算回去,就只有466GB了,足足少了34GB,这也就是为什么你在Windows里看到的磁盘容量永远是缩水的,就为了这事儿,硬盘厂商还被告过好几次,比如这次:

ff8c79ec7b23a50889c7e7a25a7d9bd0.png

正是因为这笔糊涂账,现在厂商在卖硬盘的时候,都会特别标明容量的计算方法,省得有人闲着没事再跑去投诉:

1f4af5814bf8deac07e12a3b4aed5cf6.png

摘自某品牌硬盘天猫商品描述

但我们的问题是,为什么操作系统一定要用1024倍来计算呢?或者说,当初是因为什么原因,才产生了1024这种算法呢?

其实当Vita哥哥问我这个问题的时候,我一瞬间认为这个问题很容易解释,因为计算机用的是二进制,自然要用2的幂来进位啦,这似乎挺自然的。

但是说到这里我就发现有点说不通了。

计算机用的是二进制没错,但那个代表的是计算机所处理的数据,而不是代表数据的数量。举个例子,现在有若干个储物柜,每个柜子可以装一位数,处理二进制的时候,柜子里只能放0或1,而处理十进制时,柜子里可以放0~9,仅此而已,但是这跟我有多少个柜子又有什么关系呢?

《嘭!编程超有趣》那本书上面给出的解释是:“如果我们要处理的数字都是2的幂,那事情就会方便的多。Hmm,这个解释好像也挺含糊的,到底哪里方便呢?虽然书上写着“下一页我们会展开说”,但其实下一页说的只是二进制和十六进制之间的关系以及如何转换而已,并没有给出我们想要的答案。

那当初到底为什么出现了1024呢?这个问题和计算机内存的寻址系统有关。

3e8a768fc9fd86b16be95b6231bdbeb8.png

见过内存条吗?

所谓寻址,就是访问内存里面特定的地方,就像按编号找到某个特定的储物柜一样。CPU里面有一个东西叫“地址总线”,这个东西用来编码要访问的内存地址,也就是储物柜的编号。地址总线就是一堆电线,跟CPU里的其他元件一样,每一根都只能表示0或者1,也就是说,它也是用二进制来工作的。那么,地址总线有多少根,就决定了CPU能编码多少内存地址,超过这个范围之后,即便你装再多的内存,CPU也用不上了,这个范围就叫做CPU的寻址能力

我们计算一下,如果地址总线的长度是1,那么能编码的内存地址就是2的1次幂,也就是2个;地址总线的长度是2,就能编码2的2次幂,也就是4个地址;以此类推,地址总线的长度是N,CPU的寻址能力就是2的N次幂。

剩下的事情你应该能自己琢磨明白了。既然CPU的寻址能力是按2的幂计算的,那么内存的容量也就应该按2的幂来设计,这样才能跟CPU的寻址能力匹配。比如说,一块CPU的地址总线长度为8,它的寻址能力是2的8次幂,也就是256,如果设计内存的人按100、200、300这样来设计内存容量,那永远也找不到合适的对不对?于是,内存容量就都被设计成了2的幂。

0e5a3e2824605514895b9d2f705b45c3.png

图片来源:https://www.jianshu.com/p/efe6deafa6a7

一开始内存容量小的时候,也不存在单位换算的问题,比如我这个内存4096字节哦,也没啥问题。但是后来内存容量越来越大,工程师们感觉表达起来不爽了,这时他们想到,很多单位都有前缀,比如米→千米(km)克→千克(kg),那我们也搞一个“千字节(kB)”就好了吧。

这时问题又来了,内存容量都是2的幂,就比如说4096吧,如果按1000进位的话,就要写成4.096kB,这一点儿都没有变短啊!似乎没什么卵用啊!于是工程师们拍脑袋一想,这样吧,我们就用1024进位好了,1024是2的10次幂,符合内存容量的设计习惯,比如说4096=4x1024,也就是4kB,你看,变短了很多吧!此外,1024跟1000挺接近的,也符合人类(主要是指欧美人)逢千计数的习惯,而且就算近似按1000估算也问题不大,真是两全其美!

所以说,用1024来进位是内存寻址架构设计上的历史原因,但磁盘(软盘、硬盘)从一开始就没有这个问题,因为:第一,磁盘的寻址和CPU的架构没有关系(磁盘访问由操作系统负责);第二,磁盘的基本存储单位是“扇区”,而不是单个字节,一个扇区的容量不是固定的。这就意味着,磁盘容量没必要非要按2的幂去凑整,而是可以怎么方便就怎么来

IBM个人电脑上用的软盘为了迎合内存容量的二进制习惯,规定一个扇区的容量是512字节,那么两个扇区的容量就是1024字节,也就是1kB。因此,我们以前用的360kB、720kB的软盘,它们的1kB都代表1024字节,但后来出现的高密度软盘,容量写的是1.44MB,但实际上它的容量是720kB软盘的两倍,也就是1440kB——在这个节骨眼上,软盘厂商居然玩起了精分,让1kB代表1024B,而1MB却代表1000kB,真是又一笔糊涂账!

998ce4712da43c2f6708c8fa94c34be2.png

索尼大法出品的3.5英寸软盘

注意上面写着容量是1.44MB,其实是1440kB

相比之下,硬盘厂商就专一多了。硬盘因为容量大,一开始就是MB尺度了。从20世纪70年代起,硬盘厂商在标示容量时就是按1000进位计算的,而这种标准沿用了几十年,到今天也依然是雷打不动。

这笔糊涂账让做操作系统的很是为难。毕竟,内存容量和磁盘容量的算法不一样,你让操作系统怎么显示才好呢?结果呢,当初几乎所有的操作系统都采用了内存的二进制标准,也就是按1024进位,那么磁盘容量也就跟着保持一致,也按照1024进位来计算,于是系统显示的容量就和硬盘上标示的容量有差距了。

本来呢,这个差距也不是很大,但是让人们没想到的是,数据容量的增长速度实在太快了,才过了没几十年,我们身边的数据都已经按GB甚至TB来计算了。在kB尺度上,按1024计算和1000计算的误差只有2.3%,但放到TB尺度上,这个误差就被放大到了9%,这就已经完全无法忽略不计了,这也正是为什么磁盘容量进入GB时代之后,普通用户才开始纠结这件事

3e8fc14c960df95f702c99bb36aacbe7.png

不同数量级中按1000和1024计算单位所产生的误差

那么,现在的问题是,1kB有时是1000字节,有时又是1024字节,这件事实在是太混乱了。根据国际单位(SI)的规定,k、M、G等等这些前缀之间的倍率关系都是1000,那么用1024就明显和SI是矛盾的。于是,国际电工委员会(IEC)想了一个方案,说那这样好了,凡是需要表示1024进位的,就用另外一套前缀:Ki、Mi、Gi,就是后面加个i,那么这样一来,1kB就是1000字节,而1KiB才是1024字节

后来,IEC的这个方案变成了国际标准(ISO),所以严格来说,表示1024进位的时候一定要用IEC的这套新的前缀哦。在合规这方面,Ubuntu操作系统貌似是做得最好的,不信你看:

020fadf14d82efd2a7d73de2b1090763.png

注意内存容量都是用GiB或者MiB作为单位

只有网络速率用的是“KB/秒”,这里的倍率是1000

苹果的macOS系统里面,磁盘容量显示的单位也是按照1000倍率来换算的,不信你看:

af2cfaddbbf2890a6f72dd18701cacd0.png

已使用:362,041,094,144字节 (362.04GB)

这里的GB也是按1000倍率换算的

于是,只有Windows现在依然是一笔糊涂账,明明磁盘容量按1024换算,但显示用的却还是MB、GB这种按标准应该表示1000的单位。偏偏Windows用户又是最多的,于是很多人到现在还在这个问题上糊涂着——我买的硬盘,怎么系统里显示的容量就缩水了这么多呢?


最后总结一下

  • 因为CPU寻址架构没变,所以内存容量现在依然是2的幂,即按1024倍率计算的。例如,你的电脑有4GB内存,严格来说应该写成4GiB,实际容量是4x1024x1024x1024个字节。

  • 硬盘、闪存等存储设备的容量都是按1000倍率计算的。例如,你的500GB硬盘,实际容量是500x1000x1000x1000个字节。但是,Windows会告诉你它的容量只有466GB,这不是硬盘的错,是Windows的错。

  • 网络带宽(传输率)也是按1000倍率计算的。例如,你家的宽带是100M,意思是最大传输率为每秒100x1000x1000个比特(8个比特是1个字节),也就是每秒12,500,000个字节。

顺便,《嘭!编程超有趣》确实超有趣,感谢译者陈少芸老师赠阅,有兴趣的话点查看原文去某东买吧。

P.S. 我没广告费,想支持我的话点在看或者点赞赏吧8c2a891cc3edd4947a14ce74b6d47d11.png

79668a96256d74fa8110214037ddc5d1.png

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值