为什么1T的硬盘只有931G?
先来看一段引用自https://physics.nist.gov/cuu/Units/binary.html的话
英文原文:
Historical context
Once upon a time, computer professionals noticed that 210 was very nearly equal to 1000 and started using the SI prefix “kilo” to mean 1024. That worked well enough for a decade or two because everybody who talked kilobytes knew that the term implied 1024 bytes. But, almost overnight a much more numerous “everybody” bought computers, and the trade computer professionals needed to talk to physicists and engineers and even to ordinary people, most of whom know that a kilometer is 1000 meters and a kilogram is 1000 grams.Then data storage for gigabytes, and even terabytes, became practical, and the storage devices were not constructed on binary trees, which meant that, for many practical purposes, binary arithmetic was less convenient than decimal arithmetic. The result is that today “everybody” does not “know” what a megabyte is. When discussing computer memory, most manufacturers use megabyte to mean 220 = 1 048 576 bytes, but the manufacturers of computer storage devices usually use the term to mean 1 000 000 bytes. Some designers of local area networks have used megabit per second to mean 1 048 576 bit/s, but all telecommunications engineers use it to mean 106 bit/s. And if two definitions of the megabyte are not enough, a third megabyte of 1 024 000 bytes is the megabyte used to format the familiar 90 mm (3 1/2 inch), “1.44 MB” diskette. The confusion is real, as is the potential for incompatibility in standards and in implemented systems.
Faced with this reality, the IEEE Standards Board decided that IEEE standards will use the conventional, internationally adopted, definitions of the SI prefixes. Mega will mean 1 000 000, except that the base-two definition may be used (if such usage is explicitly pointed out on a case-by-case basis) until such time that prefixes for binary multiples are adopted by an appropriate standards body.
翻译成中文:
历史背景
很久以前,计算机专业人员注意到210 接近等于1000,于是开始使用SI(International system of units:国际单位制)前缀“kilo”来表示1024。这在10到20年的时间里都运行得很好,因为每个说千字节的人都知道这个术语意味着1024字节。但是,几乎在一夜之间,越来越多的“每个人”都购买了电脑,计算机行业的专业人士需要与物理学家、工程师甚至是普通人交谈,他们中的大多数人都知道一公里等于1000米,一公斤等于1000克。然后,千兆字节甚至兆兆字节的数据存储成为现实,而且存储设备不是在二叉树上构造的,这意味着,在许多实际用途上,二进制算法不如十进制算法方便。结果是,今天“每个人”都不“知道”兆字节是什么。在讨论计算机内存时,大多数制造商使用兆字节来表示220 = 1 048 576字节,但是计算机存储设备制造商通常使用兆字节来表示1 000 000字节。局部区域网络的一些设计者使用兆比特每秒来表示1 048 576比特/秒,但所有电信工程师都使用兆比特每秒来表示106比特/秒。如果兆字节的两个定义还不够,那么1 024 000字节的第三兆字节就是用来格式化熟悉的90毫米(3 1/2英寸)“1.44 MB”软盘的兆字节。混淆是真实存在的,标准和实现系统中的潜在不兼容也是如此。
面对这一现实,IEEE标准委员会决定IEEE标准将使用国际通用的SI前缀定义。Mega将意味着100 000 000,除非可以使用base-two定义(如果这种用法是根据具体情况明确指出的),直到合适的标准机构采用二进制倍数的前缀为止。
- 简单的说,因为计算机系统是用二进制的,所以都是以210=1024为进位的(比如1KB=210Byte=1024Byte),因为计算机技术的发展,几乎一夜之间很多非专业人士买了电脑,销售人员为了方便向这些人解释KB/MB/TB之间的关系,所以把存储设备各单位之间的进位做成103而不是210,原因是这些人都知道1kg=1000g,1km=1000m,所以为了方便理解,就把1024改成1000(这样普通人就很容易理解,因为1kg=1000g,所以1kb=1000b是很容易理解的事),这样就容易向人们解释。
- 然而,虽然硬盘用了1000进位(即103进位),但操作系统还是用的二进制进位计算(比如windows,进位还是1024Byte=1KB,1024KB=1MB,1024MB=1G,1024GB=1T),所以一个1T的硬盘,如果按1000进位(即103进位)算,它就是1000G,1T=103G=106MB=109KB=1012Byte,即1T=1012Byte
- 但如果按windows的算法,1T=1012Byte=1012/1024KB=976,562,500KB
976,562,500KB=976,562,500/1024MB=953,674.31640625MB
953,674.31640625MB=953,674.31640625/1024GB=931.3225746155GB≈931.3GB - 但是Mac是按硬盘的实际进位(即1000进位)来算硬盘大小以及文件大小的(Mac比较人性化),所以在Mac中所以,一个1T的硬盘,在Mac中是999.86GB(后面的小数不一定非常确定)也就是几乎是1000G,而在windows中是大概931G。
- 有人可能会问了,那这样的话,硬盘在Mac中不是多了69G?这个理解肯定是错的,因为在Mac中,文件也是按1000进位来计算的,也就是同一个文件,在Mac中显示的大小会比在windows中显示的大,所以硬盘在windows和在mac上实际能存储的东西是一样多的。比如Mac中有个文件大小是100M,在windows下可能就会显示为108Byte/1024/1024=95.3674316406≈95M,它们实际大小都是一样的,都是108字节,只是按不同进位转换单位后结果不一样而已,也就是说,如果我们只用最小单位『字节(Byte)』来表示文件大小,硬盘大小的话,在windows上和在mac上是没有区别的,它们现在有区别是因为从『字节』转成『千字节』,一个是除以1024,一个是除以1000,所以最后得到的数,自然就是除以1024的看起来小了。
事实上,计算机届的字节单位是有一个标准的。
在国际通用的国际单位制标准(SI)中,kg / km 是我们最常见的单位了,这其中的k,其实是英文的kilo,表示103,类似的还有
SI单位 | 简写 | 值 |
---|---|---|
kilo | k | 103 |
mega | M | 106 |
giga | G | 109 |
tera | T | 1012 |
peta | P | 1015 |
exa | E | 1018 |
zetta | Z | 1021 |
yotta | Y | 1024 |
注意:简写中,k是小写,其它全部大写!而且不难发现,这些单位都是1000进位的。
但是,后来随着计算机信息技术的发展,工程师们发现,国际单位制标准不适用于计算机工业,因为计算机是使用二进制方式进行计算的,所以数据的大小都是以2n来表示的(相反国际单位制标准SI中的单位是用10n来表示),数据量一大,就需要用大单位来表示。比如用210来表示1kB,这样跟国际单位制标准差不多,用220来表示1MB,也跟跟国际单位制标准差不多!
但是如果还是用kB、MB之类的单位,肯定会跟国际单位制标准单位混淆,怎么办呢?创造!文字都是人创造出来的!
计算机行业的工程师们联合了起来,由国际电工委员会(IEC)制定了新的用于1024进位的数字前缀,规则是将原本国际单位制标准对应单词中的前两位+”bi”(bi是二进制英文binary的前两位),比如kilo的前两位是ki,加上bi就是kibi,同理,mega→mebi,giga→gibi等等。
而对应的缩写,也从原本的单字母变成了附上”i”,比如kB变成KiB,MB变成MiB,全称为kibibytes,mebibytes。
二进制单位 | 简写 | 值 |
---|---|---|
kibi | ki | 103 |
mebi | Mi | 106 |
gibi | Gi | 109 |
tebi | Ti | 1012 |
pebi | Pi | 1015 |
exbi | Ei | 1018 |
zebi | Zi | 1021 |
yobi | Yi | 1024 |
所以,严格来说,Windows中文件大小的单位,或者网盘上文件大小的单位,都应该写成有i
的,比如KiB、MiB、GiB、TiB等等。
但因为这套标准在1998年才提出,虽然马上写入了ISO标准中,但当时Windows都已经出Windows 98了,所以并没能很好的统一整个计算机业界,很多系统和厂商仍然保持了1 KB=1024Bytes的表示方式,并没有附上”i”。内存方面的JEDEC标准也仍然我行我素,采用了与Windows一样的表示方法,所以我们今天在内存上看到的GB、MB等单位都是1024进位的。而硬盘存储业界,仍然使用1 KB=1000 Bytes的国际单位制标准对容量进行描述。
基于种种历史原因,导致今天的单位错乱,但我们只需要记住一点,容量跟标称对不一,那你就用单位转换试试,基本上就是单位转换的原因。
另外顺便提一下b的写法问题。
前面我们说的kB或者kiB,这里的B
,其实是指Byte
,也就是“字节”。而其实以b开头的还有另一个单位,叫bit
,中文直接音译为“比特”,其实比特就是“位”的意思,字节和比特的转换,是1Byte=8bits。
那么我们什么时候会用到“比特”这个单位呢?其实它就在我们的生活中!我们安装网线的时候,经常有听到百兆宽带(100M宽带),或者更快的,300M宽带,还有我们最常用的TP-Link等路由器,某宝上的标题会写 300M、1200M高速率路由器,还有什么千兆网卡之类的。
那么100M的网络,是不是意味着你下载速度会达到100M/s呢?很显然大家都知道,并不是!这个是怎么算的?其实这里的百兆、千兆用的都是比特率,我们叫“速率”,它的真实下载速度,要除以8才是真正的数据量,100/8=12.5,所以百兆网络理论最快速度是12.5M/s,当然实际会有损耗及各种原因,会比这个值小。
这些“速率”单位正确的写法,其实是Mbps,Mb中的b是指bit
,这也是为什么要小写的原因,ps是per second(每秒)。
那么,这些速率的进位是怎样的呢?比如1Mbps=1000kbps吗?还是1Mbps=1024kbps?
由于国际单位制占据了统治的地位,这些使用bit作为单位的量,大部分采用的都是1000进位而不是1024进位。
也就是说,100M的网络,如果要把它化成最小单位,那就是:
100M = 100Mb = 100 * 1000Kb = 100 * 1000 * 1000b = 108b。
但是按Windows的计算方法,这108b会是多少M呢?
108b = (108 / 1024)Kb = (108 / 1024 / 1024)Mb = (108 / 1024 / 1024 / 8)Mib ≈ 11.92MiB/s (注意小写b都代表bit,大写B都代表Byte,1Byte=8bits)。
但按Windows一贯以来的错误写法,它都是写成11.92MB/s,这就比理论上的12.5MB/s少了一点。
而事实上,速率一直都是那个数,也就是108b/s,只不过我们转换成大单位时,用了不同的进位(1000和1024),才导致我们看上去的速度不同。