我們從小就從【資訊科技】課本上學習到了電腦儲存單位轉換的知識:
電腦儲存以字節(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)
同樣是標準光碟的容量,卻采用了不同的單位字首,實在是很奇怪。