为什么地磅的读数有进制么_1024程序员节 | 为什么电脑里KB、MB要用1024进位?

上周末,Vita君去参加了青少年算法竞赛小学组(也就是原来的NOIP小学组)的初赛。

147f93dd1bc68797398ef2e9928ebfff.png

其实他C语言刚学了一个月,所以毫无悬念地考得不咋地。不过里面有一道题,他虽然答对了,但是他觉得有疑问,趁着今天是1024程序员节,要不我们在上学路上掰扯一下?

da30b6208f3c0e6afc53cabc376d519d.png
就是这道题

对于老程序员来说,计算机系统采用1024进位这件事已经是很熟悉的事情了,但是这件事真的这么简单吗?拿这道题来说,U盘里面的8MB到底是不是按1024进位算的呢?`


硬盘和系统打架

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

05697392098c98b0e1e239b072c12171.png

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

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

51a7a6309086ee0ce97504f167cca3fb.png

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

7c000f940ff55718618183d9683f206a.png
摘自某品牌硬盘天猫商品描述

为什么会用1024

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

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

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

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

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

3da04b5e4a718d6da1d4f1bfc8db6f45.png
见过内存条吗

所谓寻址,就是访问内存里面特定的地方,就像按编号找到某个特定的储物柜一样。CPU里面有一个东西叫地址总线,这个东西用来编码要访问的内存地址,也就是储物柜的编号。地址总线就是一堆电线,跟CPU里的其他元件一样,每一根都只能表示0或者1,也就是说,它也是用二进制来工作的。

那么,地址总线有多少根,就决定了CPU能编码多少内存地址,超过这个范围之后,即便你装再多的内存,CPU也用不上了,这个范围就叫做CPU的寻址能力

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

剩下的事情你应该能自己琢磨明白了。既然CPU的寻址能力是按2的幂计算的,那么内存的容量也就应该按2的幂来设计,这样才能跟CPU的寻址能力匹配

比如说,一块CPU的地址总线长度为8,它的寻址能力是,也就是256,如果设计内存的人按100、200、300这样来设计内存容量,那永远也找不到合适的对不对?于是,内存容量就都被设计成了2的幂。

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

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

这时问题又来了,内存容量都是2的幂,就比如说4096吧,如果按1000进位的话,就要写成4.096kB,这一点儿都没有变短啊!似乎没什么卵用啊!

于是工程师们拍脑袋一想,这样吧,我们就用1024进位好了,1024是,符合内存容量的设计习惯,比如说,也就是4kB,你看,变短了很多吧!此外,1024跟1000挺接近的,也符合人类(主要是指欧美人)逢千计数的习惯,而且就算近似按1000估算也问题不大,真是两全其美!

硬盘厂商的叛逆

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

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

763b9cfdbed5a54e9bc7ea72416505ee.png
索尼大法出品的3.5英寸软盘
注意上面写着容量是1.44MB,其实是1440kB

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

这笔糊涂账让做操作系统的很是为难。毕竟,内存容量和磁盘容量的算法不一样,你让操作系统怎么显示才好呢?

结果呢,当初几乎所有的操作系统都采用了内存的二进制标准,也就是按1024进位,那么磁盘容量也就跟着保持一致,也按照1024进位来计算,于是系统显示的容量就和硬盘上标示的容量有差距了

本来呢,这个差距也不是很大,但是让人们没想到的是,数据容量的增长速度实在太快了,才过了没几十年,我们身边的数据都已经按GB甚至TB来计算了。

在kB尺度上,按1024计算和1000计算的误差只有2.3%,但放到TB尺度上,这个误差就被放大到了9%,这就已经完全无法忽略不计了,这也正是为什么磁盘容量进入GB时代之后,普通用户才开始纠结这件事。

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

存在感薄弱的ISO

那么,现在的问题是,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操作系统貌似是做得最好的,不信你看:

478d8da471491a96c307923d8c70e716.png
注意内存容量都是用GiB或者MiB作为单位
只有网络速率用的是“KB/秒”,这里的倍率是1000

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

571243d6914762d1471e956a28899b1a.png
已使用:362,041,094,144字节 (362.04GB)
这里的GB也是按1000倍率换算的

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

总结

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

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

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


所以说,开头的那道题,是不是出得有点糟糕呢?

da30b6208f3c0e6afc53cabc376d519d.png
再看一遍这道题吧

显然,U盘的容量应该是按1000进位计算的,所以这个8MB应该是个字节呢,但是文件大小按什么算呢?这可能取决于操作系统的表示方式,不同的操作系统可能不一样哦。所以这道题的表述是有歧义的

如果这道题出得严谨一点,那应该按照ISO的规范,将容量单位写成MiB,这样一来,不就没有歧义了吗?

你可能还想看

  • 《小欢喜》看完了?看出方一凡的身份证号有几个bug么?
  • 密码学小对话 | 救命!汽车遥控钥匙失灵了是咋回事?

17b5c6366bc8fa132d54a567f611d763.png

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值