(本文约4900字,预计阅读时间12分钟)
引言
前段时间,遇到一个有趣的问题,1GB究竟等于1000MB还是1024MB?究竟谁才是对的?这个问题很有趣,最近周末翻了翻资料研究了一下,写一点内容分享给大家。
首先回答标题的问题,相信很多小伙伴已经可以对答入流了。硬盘制造商标识硬盘容量的时候用的是10进制,即
而windows计算硬盘容量采用的是2进制,即:
如此一来,我们就可以得到厂商标识的1TB容量在Windows眼里就应该是
双方用的计算方法不同,那得到的结果自然就不同了。
但是如果有使用其他操作系统的小伙伴发现,在Mac OS以及linux的某些发行版中1TB的硬盘就被显示为了1TB。
那么问题来了,为什么同样的符号,却有截然两种不同的规则呢?究竟是硬盘偷工减料还是windows搞错了呢?
这个问题究竟是怎么来的?
在20世纪60年代和70年代,随着计算机技术的发展,工程师和科学家开始普遍采用二进制系统来解决计算问题。而众所周知,计算机底层是采用二进制的。而2的十次方为1024,这个数与1000接近,因此早期计算机科学家和工程师在系统设计中逐渐采用1KB = 1024B的定义,MB、GB和TB亦然。随着技术的发展,这一定义在行业内得到了广泛接受,并成为计算机存储容量和数据处理的基本单位之一。包括一些早期的行业标准中,也是如此规定的。
但是~但是~但是~采用这样一个定义存在一个非常易燃易爆炸的雷。
k、M、G、T这些我们通常称为(量化)词头。以k为例,k是kilo-的缩写,这是英文中从希腊语借用的词根,就是千的意思,如千克——kilogram(kg)、千米——kilometre(km)。这些词头在计算机引入以前在其他领域以及日常生活中已经广泛采用了。换言之,只有在计算机系统中,对上述词头进行了与众不同的量化表示。如果你是强迫症,听到这里估计要起鸡皮疙瘩了。
如果,你没有强迫症,或许没有体会到怪在哪里。那让我翻译成中文表达来体会一下:一千米表示1000米,一千克表示1000克,但是,一千字节表示1024字节。这TM也太78怪了!!!对吧????
显然,计算机相关领域的专家们也意识到了这一个问题,如果这样定义,日后必定会出现歧义。而生活在现在的我们已经知道了,这个导致的歧义不仅有,还很大。市面上对GB定义不清、各种混用的情况比比皆是,搞得大家头都大了。
既然GMK已经有定义了,那换一个符号表示不就行了嘛?
是的,先前的工程师们就是这么想的。1988年,国际电工委员会(IEC)发布了国际标准 IEC 60027-2,该标准定义了以二进制为基础的单位,以便于在计算机科学和信息技术领域中更清晰地表示数据存储容量。
IEC引入了一套新的量化词头,包括:
Kibibyte (KiB): 1 KiB = 2^10 字节 = 1024 字节
Mebibyte (MiB): 1 MiB = 2^20 字节 = 1,048,576 字节
Gibibyte (GiB): 1 MiB = 2^30 字节 = 1,073,741,824字节
Tebibyte (TiB): 1 TiB = 2^40 字节 = 1,099,511,627,776 字节
Pebibyte (PiB): 1 PiB = 2^50 字节 = 1,125,899,906,842,624 字节
GiB,全称Gibibyte,是giga binary byte的缩写。其中binary就是二进制的意思。其他单位也同理,这些词头专门用来表示1024进制。
现在我们有新的单位词头来表示1024进制了,而原来的KMG,还是还回去让它们继续表示十进制词头吧。
写到这里,我需要做一点补充说明,IEC对GB和GiB的重新定义不涉及任何技术问题!!!!我看到有很多人有误解,觉得“计算机是二进制的,1GB就应该表示1024MB。计算机中进位用1000简直就是异端”。
其实不是这样的,这些新标准不是技术标准,他们的核心仅仅是:当我进行书面表达时,需要一个词头来表示1000或1024(及更高进位),写成什么符号更合适。
IEC的新标准可以非常好的解决该歧义的问题,同时也得到了其他众多组织和标准的支持。
2000年,国际标准化组织(ISO)在其标准 ISO/IEC 80000-13:2008引入了上述前缀,2005年,电气和电子工程师协会(IEEE)在其标准 IEEE 1541-2002 中引入了上述前缀。
上述组织在计算机乃至多个领域内都是鼎鼎大名的,具有非常广泛且强大的国际影响力,有计算机专业背景的同学肯定都很熟悉。
有这么多组织推动,看来解决歧义问题势在必得了.......吗?
新词头的推广有着无尽的阻力
尽管,众多行业龙头组织出台了一系列标准试图解决GB的歧义问题,但人的习惯哪会说改就改的。
在计算机诞生后的一段时间里,1024进制就是该领域不争的事实标准。而后的很长时间,GB的混用问题持续存在,直到如今。而在此期间,各种资料书籍等持续影响着后来人。时至今日,很多大学生上课接触到的课程和课本依旧是1024进制。
尤其是堪称国民级操作系统的Windows OS,在表示内存和硬盘的时候也是用1024进制来计算的。而windows对广大用户的潜移默化的影响力,可能比一些行业龙头的一张白纸要大的多。
而现代的的一些linux发行版,以及Mac OS(在版本10.6 Snow Leopard之后),都对该问题进行了更标准化的表达。因此也出现了一些比较极端的观点,认为Windows对新行业标准的支持不够积极是导致如今词头混乱的罪魁祸首。至于为什么Windows没有积极响应,是技术还是意愿那就不得而知了。
但话说回来,windows真的没有遵守行业标准吗?
标准不是你几个组织就说了算的
虽然很多行业标准对该问题进行了定义,那有没有行业标准依旧保持1GB=1024MB的定义吗?还真有。
联合电子设备工程委员会(JEDEC)2002年发布了100B.01标准“微型计算机、微处理器和存储器集成电路的术语、定义和字母符号“,该规范依旧引用了KMG作为1024进制的三个前缀。
可能会有朋友不认识这个组织,觉得什么野鸡组织也配乱下定义。实则不然,大家耳熟能详的内存标准DDR就是该组织发布的。该标准化组织在半导体工业界,尤其是内存和固态等领域也是有着十足的影响力的。如此看来,对于硬盘内存的容量表达,似乎JEDEC的标准才是正统啊?
哎,话又说回来啊。100B.01标准中也提到“这种做法(指KMG等词头)经常导致混淆并被弃用”,引入这些前缀只是为了“反映常见用法”,他们也推荐了IEC标准中的二进制字母符号,用于替代旧的词头。
只不过,二十多年过去了,JEDEC再也没出台新的标准对词头使用进行明确约束,100B.01标准是该组织最后一次对词头进行明确表态。这么看来,内存、硬盘遵守1024进制似乎也是情有可原。
哈哈哈怎么可能呢,别忘了标题,就是硬盘厂商采用了1000进制的计算才有今天这篇文章。小弟们没一个听话的,真正遵守规范的反而是windows。也确实,对于硬盘厂商而言,同样写成1GB,采用1000进制的标准,既很多有行业标准的支持,又节省了成本,何乐而不为呢?
在这里再扯远一点,有人应该还会好奇,包括我,内存应该还是遵循JEDEC标准的吧?
让我来打开电脑看一看,我电脑上插了两条8+16”GB“内存。用相关工具输出一下:
虽然各个工具输出的具体值有所差异,但显然识别到的内存容量是显然高于24*10^9的,而且考虑到可能有少量内存被BIOS和kenel内核保留而未被正确识别,内存中GB确实是遵循JEDEC标准的二进制的。其中lshw工具为了避免理解有误,非常贴心的采用了GiB的输出,free工具也可以通过参数指定不同的单位,这点好评!
混乱,混乱,还是***混乱
搜集资料的时候,发现了一些好(wu)玩(yu)的事。
在美商海盗船的官网有一篇文章,文中对二进制词头和十进制词头进行了明确的解释,并且对混用现象表达了无奈。“你会经常看到“Megabyte ”或简称 MB,指的是 1,000,000 字节或 1,048,576 字节中的一个,但却不知道是哪一个。”
有意思的是,美商海盗船其官网描述其内存的时候至今仍然用的是GB单位,左脑和右脑博弈了属于是。
类似的案例还有金士顿,金士顿在官网的内存术语表中也对GB为10进制单位进行了明确表述。有条件的小伙伴可以查查看金士顿和海盗船的”xGB“内存究竟是GB还是GiB。
混乱远不止于此!!上述内容还能归结为单位不统一,但下面这个真的可以让强迫症噶过去了。
应该有的小伙伴在买硬盘的时候也遇到过,一个1TB的硬盘,Windows显示953GB。这又是怎么回事呢?
原来该厂商是这样计算的:1TB=1024GB,但是1GB=1000MB=1000^2kB=1000^3Byte。也就是一个硬盘同时混用了1000进制和1024进制!!!
混乱,太TM混乱了。
这么多标准,就没一个能顶事的吗?
前面的内容中,我们提到了很多国际组织和标准,有人会有疑问,“这些标准谁大谁小”、“谁能管的住谁”、“谁更具权威”等。其实这些标准都不是强制执行的,也不存在包含和克制关系。这些标准都是各组织在各自领域希望推动行业规范化的一些“倡议”,甚至历史上,行业不响应“倡议”把标准推翻的例子也屡见不鲜。
那么问题来了,就没有一项标准是强制执行的吗?其实还真有。
国际计量大会(CGPM)采纳和推荐的一贯单位制——国际单位制(SI),是现时世界上最普遍采用的标准度量衡单位系统。比如,大家学物理肯定知道的七个基本物理量:长度(米)、质量(千克)、时间(秒)、电流(安培)、热力学温度(开尔文)、物质的量(摩尔)和发光强度(坎德拉)。我们现在所采用这些物理量的单位,米啊、千克啊、秒啊等等,遵循的就是国际单位制。
那该标准和其他行业标准有何区别呢?区别就在于,很多国家在政府文件引入了国际单位制(SI),也就意味着该标准是受法律保护的。以中国为例,在《中华人民共和国国家标准GB3100-93》文件中,明确了国际单位制及其应用的规范。
那么国际单位制是如何对词头进行定义的呢?国际单位制词头如下定义。
虽然国际单位制并没有引入Gi、Mi等词头,但对kMG等词头的使用进行了约束。按照规范,1GB=1000MB=1000^2kB=1000^3B是没问题的。换言之,如果因为用GMK表示1024进制造成纠纷或其他不良影响的,可能会存在潜在的法律风险。
不过在我国的国家标准中有一条补充:有些国际单位制以外的单位,可以按习惯用SI词头构成倍数单位。显然,计算机中的各种信息量的单位属于国际单位制之外的范畴,这个“按习惯”还是给了一定的空间。我也没查到有关该争议的判决文书,所以从具体执行方面讲,依旧算是灰色状态。
结语
综上所述,这个问题是一个持续已久的历史遗留问题。我写这篇文章,也并不是想对Windows指责,更不是为硬盘厂商洗白。希望能帮大家理清一个词头混用问题的历史发展脉络,以及为了解决该问题的一些方案和趋势。
目前GB依旧处于混用的状态。在日常常接触到的地方,其表示二进制词头的地方主要包括内存厂商对内存的标注和Widows对硬盘和内存容量的计算。其他方面,比如硬盘厂商对硬盘容量的标注、安卓(存疑)和苹果系统对容量的计算,以及网速带宽等地方出现的词头G,多是十进制的。
从我个人来讲,还是希望二进制词头能够普及的。从用户的角度,普及二进制词头可以很好的避免单位混淆带来的困惑;对厂商而言,普及二进制词头同样可以得到更加广泛的行业支持。这本就是一件双向奔赴的事。
只是出于历史惯性,想要在大众中普及,绝非一朝一夕的事。可以预见,我们还要在这种混乱的状态下,挣扎很久......
更多游戏资讯请关注:电玩帮游戏资讯专区
电玩帮图文攻略 www.vgover.com