我们从小就从【信息技术】课本上学习到了计算机存储单位转换的知识:
计算机存储以字节(Byte)为单位1024 Byte = 1 KB
1024 KB = 1 MB
1024 MB = 1 GB
考试重点:是满1024进位,而不是满1000进位
今天我要说的是: 这是错的。
先放一个结论在开头吧,以防后面说得太复杂吓跑大家。
表示存储单位时,有两种规范的写法
第一种是使用 国际单位制(SI)十进制前缀 ,如下:
1000 Byte = 1 kB1000 kB = 1 MB
1000 MB = 1 GB
其中kB、MB、GB也可以用英语单词全称,依次是:kilobyte,megabyte,gigabyte
第二种写法是使用 IEC 60027-2二进制前缀 ,如下:
1024 Byte = 1 KiB1024 KiB = 1 MiB
1024 MiB = 1 GiB
其中KiB、MiB、GiB也可以用英语单词全称,依次是:kibibyte,mebibyte,gibibyte
其余的表示法和转换规则都是不规范的,或者说是错误的。
下面来详细说一下。我们所有熟悉的单位,都是1000进位,比如长度单位m(米),1000 m=1 km。为什么全世界的单位只有计算机的K跟别的不一样?这些k、M、G的前缀又是怎样规定的呢?
国际单位制(SI)国际标准文档规定了我们熟悉的k、M、G等前缀。这些前缀被称为 国际单位制(SI)十进制前缀。
国际标准文档中具体的表述是这样的
蓝框当中就是我们熟悉的十进制前缀。比如千米(km)的英文是kilometer等等,就可以根据这个规则拼起来。
但值得注意的是黄框里的内容:
These SI prefixes refer strictly to powers of 10. They should not be used to indicate powers of 2 (for example, one kilobit represents 1000 bits and not 1024 bits) . The IEC has adopted prefixes for binary powers in the international standard IEC 60027-2: 2005, third edition, Letter symbols to be used in electrical technology – Part 2: Telecommunications and electronics . The names and symbols for the prefixes corresponding to 2^{10} , 2^{20} , 2^{30} , 2^{40} , 2^{50} , and 2^{60} are, respectively: kibi, Ki; mebi, Mi; gibi, Gi; tebi, Ti; pebi, Pi; and exbi, Ei. Thus, for example, one kibibyte would be written: 1 KiB = 2^{10} B = 1024 B, where B denotes a byte.Although these prefixes are not part of the SI, they should be used in the field of information technology to avoid the incorrect usage of the SI prefixes .
我翻译一下:
这些国际单位制(SI)前缀严格地指代10的几次方,而 不应该用于指代2的几次方(例如,1 kilobit表示1000 bits而不是1024 bits) 。国际电工委员会(IEC)已经在国际标准IEC 60027-2: 2005(文档全名见原文)当中规定了用于2的次方数的前缀。其中2^{10} , 2^{20} , 2^{30} , 2^{40} , 2^{50} 和2^{60} 的名称和对应的符号依次为:kibi, Ki; mebi, Mi; gibi, Gi; tebi, Ti; pebi, Pi; and exbi, Ei. 也就是说,1 kibibyte可以写成 1KiB,它等于2的10次方B,也就是1024 B,其中B表示的是字节(byte)。这些前缀不是国际单位制(SI)规定的,它们被用于信息技术领域,以避免 对国际单位制(SI)前缀的误用 。
国际单位制(SI)国际标准里提到了另外一个标准,那就是国际电工委员会的IEC 60027-2: 2005,这个标准才是规定信息技术领域存储单位前缀的标准。我们找来看一下:
不但有明确的规定,下面还举了例子,比如1 MiB = 1048576 B,比如1 MB = 1000000 B. 而且NOTE里还很贴心的教给大家该如何用英语读这些前缀。大概是说第一个音节(如ki,me,gi等)跟SI前缀一样的发音,第二个音节(bi)发bee的音。
正确的说完了。再说说我们的教材为什么会错。
如果你用过苹果电脑的macOS操作系统,你会发现同一个文件拷贝到苹果系统里之后,显示的大小会比Windows里大一些。这是因为苹果电脑的macOS系统的存储单位采用的是国际单位制(SI)的十进制前缀,也就1000进位的,而Windows里的换算是按1024进位的,同一个文件到了macOS系统里,显示的大小就会大一些。macOS系统遵循了SI的规范写法,把文件大小的单位写作MB、GB等等。
如果你用过Linux操作系统,你会发现很多命令行工具里会广泛地使用MiB、GiB这样的单位。Linux系统以及之上的大部分GNU软件包都遵循了IEC 60027-2标准,使用了规范的二进制前缀。
但Windows操作系统显示的是KB、MB、GB等SI十进制前缀,而实际进行单位转换时却按照1024进位的方式进行转换。所以错的不是我们的教材,而是Windows操作系统……
非常意外地发现很多软粉在评论区疯狂地为微软洗地???
如果你要教育我说微软这样改不符合用户习惯,有兼容性问题等等等等,我建议你免开尊口,因为微软已经在改了。我举一个例子:
这是一个名叫StrFormatByteSizeA的Win32 API函数。它的作用是将字节数转换成以KB、MB结尾的字符串。这个函数的文档里有这么一句话:
In Windows 10, size is reported in base 10 rather than base 2. For example, 1 KB is 1000 bytes rather than 1024.从Windows 10开始,这个函数返回的不再按照1024进位的方式转换,而是采用国际单位制(SI)的规则,返回1000进位转换后的结果。
说白了,微软并不认为一个小小的转换、一个简单的字符串会有什么兼容性问题,API这种最不应该改的东西说改就改了,其余的还不改无非就是懒得动弹,或者傲娇而已。
2020年1月21日更新!感谢评论区网友提示我关注一下新版Windows 10的计算器,里面有一个单位换算功能,如图:
已经可以选择SI十进制前缀或者IEC二进制前缀,并得到符合标准的转换结果了。很高兴Windows 10已经在拥抱标准了,只不过这个动作有点慢了。以「兼容性」为由为微软早期版本洗地的软狗又中一箭,大快人心~
最后给大家奉上几个冷知识
一张可刻录的CD光盘的容量是700MiB (1024进位)
一张可刻录的DVD光盘的容量是4.7GB (1000进位,相当于4.38GiB)
同样是标准光盘的容量,却采用了不同的单位前缀,实在是很奇怪。