外存儲設備的實際容量為什麼比標示容量小?


@林燦斌 說得太嚴重了。兩種計數方法真正的原因是,早期(真的很早,1950年代)的計算機曾經有兩種內存定址方法,一種是用十進位定址的,另一種是用二進位定址的。十進位定址的自然用1K=1000,而二進位定址的就定義1K=1024了。IBM那時候同時生產兩種計算機(比如IBM 701是二進位定址,而IBM 702就是十進位),不同的計算機的使用手冊裡面定義的K就不一致。

當然,1980年代的PC出現以後的計算機都是二進位定址了,微軟給IBM寫DOS自然用了1K=1024。蘋果最早也都是1K=1024的用。一直到1997年才有人提出用KiB來區分1024和1000。但是大家都習慣了,沒那麼容易改過來。

所以這其實就是個約定俗成的事情,並非違反標準,也不是什麼別有用心的謊言。至於磁碟廠家嘛,一開始也比較亂,但後來大家發現1000用得方便又好看,就都用1000了。但不管怎麼說,因為最早是內存定址方式引起的,所以如果是說內存的話,1K總是1024的。

-------------------

(補充點隨想)

沒想到這問題還能帶出這麼多討論,真是有點呵呵了。我原來偶然發現這麼個小問題,看到排第一的同學的答案,實在是覺得很搞笑,通篇都是義憤填膺的痛罵微軟「一錯到底」「違反標準」,說很多人覺得微軟是「唯一真理」」至高無上「,微軟員工也是什麼「大公司的傲慢自大」,還能從這問題中總結出來一條什麼「當謊言說上一千遍,那便成為了真理」。不知道為什麼答主和微軟有如此深仇大恨,僅憑藉自己的想像,活生生把微軟黑成這樣。想到也可能答主並不太了解相關的計算機發展史吧,或者入行還不深,所以就補充點我了解的內容。結果就是看到自己被歸入培訓班,而答主開始更加興奮的揮舞起「Ubuntu」和「OS X」的熒光棒了:)其實簡單看看維基的二進位乘數詞頭,對混亂的情況就能了解的很清楚了(英文版https://en.wikipedia.org/wiki/Binary_prefix說得更細),基本也沒微軟什麼事情。

現在吃完晚飯,一時無聊,實在忍不住來分析分析這位的邏輯,免得這搞笑的回答再誤人子弟吧。以下引用的內容是他的原文(既然是用來分析的,應該也不算侵權吧):

1.

...本質是GibiBytes,也就是1,073,741,824 Bytes,實際上根據:

  1. 英語構詞法
  2. 18世紀就有的國際單位詞頭標準
  3. IEEE發布的IEEE 1541

微軟的操作系統中所謂的"GB"縮寫,都應該是GiB而不是GB。從一開始就是違反各種國際標準的。

英語構詞法」和「18世紀就有的國際單位詞頭標準」?Kibi-/Gibi-前綴是1998年IEC生造出來的,發音很搞笑(估計也是沒啥人用的原因),取kilo+binary之意。「IEEE發布的IEEE 1541」?對,是有這個標準定義了KiB等單位不錯,但這個標準是2002年提出來的,2010年才正式成為標準。大哥,你說微軟「從一開始就是違反各種國際標準的」,你是想讓1975年成立微軟時的比爾蓋茨找到機器貓、坐時光機來2010年把國際標準帶回去遵守?我似乎聽見比爾哭著喊著「臣妾做不到啊」呢。

2.

(順帶一提:這個前綴實際上跟其他答案說的定址沒有一點關係,內存定址並不會用到K、M、G之類的東西——這個前綴只在表示存儲大小時會用到,定址還是用的0x4A24之類的hexadecimal。)

和定址沒關係?我給你的程序分配4GB內存,你的程序用相對地址定址,你知道尋到哪裡就越界了、地址就非法了?如果GB是1024KB,這個答案很簡單,有效地址0x0到0xFFFFFFFF,全部32位數。如果用1000,有效地址是啥?0x0到0xEE6B2800,這是啥玩意兒?之所以用1024,就是因為和二進位數對齊,計算方便。

3.

再例如爆棧網的工程師,雖然伺服器也搭建在Windows環境下,但是他們的技術博客里用的,也都是嚴謹的標準單位:Nick Craver - Stack Overflow: The Architecture

這個也很有意思。Nick雖然一開始用了TB表示1,240,266,346,053等數字,但是搜遍全文,他並沒有用任何的TiB/GiB/MiB呀。那也就是說Nick已經完全標準化了,只認為TB/GB/MB都是1000進位了?那我們往下看:

The first cluster is a set of Dell R720xd servers, each with 384GB of RAM, 4TB of PCIe SSD space, and 2x 12 cores. It hosts the Stack Overflow, Sites (bad name, I』ll explain later), PRIZM, and Mobile databases.

他說他們的集群用了一堆Dell R720xd,每台384GB內存。這就有意思了,按照前面的理解,這384GB實際上是357.628GiB。Dell R720xd有24個內存插槽,請問他們是怎麼做到的?每個內存插槽上插了根14.9011667GiB的內存條?這麼殘的內存條哪兒有賣的?這樣來看,這裡的事實也很清楚:這篇文章的作者Nick根本就沒有區分GB和GiB的概念,一開始用的TB/GB也只是偷懶而已,反正也差不多。所以Nick也是培訓班出來的,因為:

培訓班出來的程序員只知道一種容量單位,還是錯誤的單位,他們管4 GB U盤叫4 GB,管4 GiB內存條也叫4 GB

4.

微軟的一個正式員工員工是在微軟的官方博客 [2]上這麼說的:

Everybody (to within experimental error) refers to 1024 bytes as a kilobyte, not a kibibyte. If Explorer were to switch to the term kibibyte, it would merely be showing users information in a form they cannot understand, and for what purpose? So you can feel superior because you know what that term means and other people don』t.

大噫就是:

公認1024 byte = kilobyte,而不是kibibyte。所以堅持kilo-不等於1024的人會有優越感,因為其他人不知道。

(這個員工本身也知道這個問題的所在,但是內心可能卻是在想:「你們這些認為kilo-不等於1024的人是在裝逼嗎?」 凸顯了大公司的傲慢和自大。)

人家微軟員工說的是你翻譯的意思嗎?怎麼感覺漏了一段呢?人說的是「幾乎每個人都把1024位元組看成1kilobyte,而不是1kibibyte。如果文件瀏覽器(Explorer)換成用kibibyte,那麼僅僅是把信息用一種用戶不了解的形式展現給他們看而已,這麼做又是為了什麼呢?這樣的話,你就能有優越感(覺得很爽),因為你知道這個術語(kibibyte)的含義而其他人都不知道。

請問這段話哪裡體現出「大公司的傲慢和自大」了?人家只是在說用戶都已經習慣了(30年!1981年DOS到2010年Win7),突然改了,絕大多數用戶就蒙逼了,唯一的好處是知道KiB的你就顯得牛逼了。

5.

如果把1024 Bytes叫作1 KB,那麼1000 Bytes還能擁有屬於它自己的名字嗎?

全球1500萬Ubuntu用戶,舉起你們的雙手!7500萬OS X用戶,揮動你們手中的熒光棒!

看到這裡,是個人的應該都感動得快哭了吧!是啊,我們要為1000 Bytes要回屬於它的名字!Ubuntu和OS X就是代表了先進的生產力!被微軟壓迫的人們站起來!。。。這是哪兒跟哪兒啊?!

-------------------

歷史就是歷史,不能虛構,技術也只是技術,不用煽情。這就像自然語言里的多義詞,一切以實用方便為主,你只要根據上下文就能判斷含義。標準的制定方便了正式文本的書寫,但是並不代表最常用的口語就都是錯的。不禁讓我想到我們的教育和考試,給我們的思考方式引入了太多的非黑即白的機械的教條,而很多人就因此缺失了包容和變通的能力。好好加油吧!騷年!


最高票答案唯一的價值是科普了 GiB 和 GB 的區別,但是並沒有什麼卵用,大多數情況下這種差別無關痛癢。關鍵是作者春秋筆法,明明 MS 不是 「始作俑者」,卻要被你們搞個大新聞,批判一番。標準還要求換行要先 carriage return 再 line feed,而 *nix 基本都是直接 line feed,反而是 Windows 符合標準。其實說穿了標準這種東西還是要和客觀實際結合,方便是首要的。當然,有了這個認識之後在必要情況下是需要換算的,避免誤會。


外存儲設備的實際容量與標示容量相符,是正確的,並沒有小。

這是因為微軟的操作系統的顯示錯誤了,這是一個歷史遺留問題,微軟只能一錯到底了。同樣地,內存儲設備廠商以及其他部分操作系統也標註錯誤了。

外存儲設備的容量標示是KB、MB、GB、TB,微軟標示的容量KB、MB、GB、TB,但是實際上微軟的標示是錯誤的,微軟使用的單位實際上應該是KiB、MiB、GiB、TiB。

例如我的這個256 GB的固態硬碟,SSD廠商標註為256 GB,是正確的。微軟標註為238.47 GB是錯誤的,實際上應該標註為256 GB或者238.47 GiB。

硬碟標註的GB是GigaBytes,也就是1,000,000,000 Bytes。而Windows上顯示的GB是錯誤的,本質是GibiBytes,也就是1,073,741,824 Bytes,實際上根據:

  1. 英語構詞法
  2. 18世紀就有的國際單位詞頭標準
  3. IEEE發布的IEEE 1541

微軟的操作系統中所謂的"GB"縮寫,都應該是GiB而不是GB。從一開始就是違反各種國際標準的。

以較為常見的KB為例,微軟欽定了KB = kilobyte = 1024 byte,k等於1024?難道月薪20k是20480元?

任何一個擁有初中英語水平的人,知道基本英語構詞法的人,都會知道kilo-這個前綴意味著什麼:kg = kilogram = 1000 gram, km = kilometer = 1000 meter。

然而在微軟的操作系統中,KB = kilobyte = 1024 byte [1]。

如果你用OS X:

8 GB的金士頓 U盤,正確地使用了GB。

不過OS X在IEEE 1541的過渡上做得還沒Ubuntu好,經常使用Ubuntu和OS X的用戶相信可以發現個中差異。

再看Ubuntu:

所有分區加起來就是240 GB,正確地使用了GB。

所以區分這兩個單位的必要性在於:

  1. 假設你有一個移動硬碟,在Windows里看有125 GB的藍光電影,你想了想,在Ubuntu里划了個128.9 GB的分區,想把移動硬碟里的藍光電影裝進去,那麼你是裝不進去的……

  2. 再比如說,在Ubuntu里,用啥配置內存?比如run個MapReduce,幾千個job、每個job最大多少內存多少磁碟多少CPU總要指定的吧?你拿KB當1024 Bytes來準備磁碟,早晚會出問題的。

當然對於很多人而言:Windows就是世界上唯一的操作系統,就是唯一的真理,至高無上的正確。世界上沒有其他桌面操作系統。那麼自然沒有必要知道這些事。只要在遇到相關問題時,怒罵其他廠商就是了。

Ubuntu的系統監視器關於MiB、GiB的使用也是正確的。

除去核心顯卡佔用的內存後,這裡的內存關於GiB的顯示也是正確的。

因為用的就是K = Kilo = 1000的正確演算法,這個規範出自英語構詞法的約定俗成(前面已經介紹過了),並且在18世紀就有了關於單位的前綴縮寫規範:國際單位制詞頭標準 [3]:

按照英語的習慣,在表示數字時,縮寫的單字母K代表Kilo(千),M表示Mega(百萬)……

1 KB = 1 KiloBytes = 1,000 Bytes

1 MB = 1 MegaBytes = 1000,000 Bytes

1 GB = 1 GigaBytes =1,000,000,000 Bytes

當然在計算機中2^n是非常常用的,所以IEEE也發布了 IEEE 1541 標準——「二進位乘數詞頭」(prefixes for binary multiples),這個報告經過好幾百個教授一致通過,令:

1 KiB = 1 KibiBytes = 1,024 Bytes

1 MiB = 1 MibiBytes = 1048,576 Bytes

1 GiB = 1 GibiBytes = 1,073,741,824 Bytes

其目的也是修正微軟的錯誤。

IEEE作為一個權威組織,相信知乎這麼多程序員,應該都是知道的,例如大學計算機入門課《計算機導論》中提及的人盡皆知的IEEE 754標準。

那麼我們就可以重現當時的情景了:在計算機出現的時候,二穩定電平信號的計算機(蘇聯也有三穩定電平的)使用二進位進行內存定址,如果要對珍貴的地址匯流排進行最大的利用,內存的大小就是2^n個單元,要表示他們的容量,當內存比較大時(計算機發展初期還沒這個需求),需要一個單位數量的前綴來方便表示內存大小。

工程師們發現 2^10=1024,與當時早已廣泛使用的單位數量前綴國際標準的K(1K=1000)非常接近。按照道理應該發明一個新的單位數量前綴,例如Ki,然後令 Ki=1024。但是工程師就這樣(畢竟不是科學家),不嚴謹,發現將1000和1024沒差多少,就沒有發明新的前綴(直到1998年IEC才發明了一個),把K當1024一直用了下來。有的人覺得640KiB內存就是計算機內存的終點,但是後來計算機的發展超越了工程師的想像,人們的常用單位也從KB變成了GB。

錯誤的K和早有的國際標準K或許差距不大。但是發展到現在,GB、TB的出現,也已經將工程師的錯誤放大到了無法忽視的程度。(3 TB = 2.72 TiB,差距不小)

至於微軟現在,體量這麼大,也是騎虎難下了。

但是一些非面向小白用戶的Windows下的第三方軟體,也還是實現了符合標準的、正確的容量單位進位轉換程序。

再例如爆棧網的工程師,雖然伺服器也搭建在Windows環境下,但是他們的技術博客里用的也是嚴謹的標準單位。當然文章中關於內存和一些第三方系統還是使用了生產廠商自身的標註,要勘誤的話估計還得解釋一番。

文章地址:Nick Craver - Stack Overflow: The Architecture(文章是關於架構設計的,本身的內容也非常值得一看!)

微軟推出的新品:

一個大約沒有人不認識的軟體:Git —— 無論在Windows還是Linux下,都遵循了IEEE 1541標準:

有一點點好奇心的程序員,或許會在使用Git時,對MiB、KiB產生疑惑。沒有任何好奇心的程序員,或許看一眼,會覺得奇怪,但也沒有想過這是什麼?Git為什麼要這麼顯示?

微軟的一個正式員工員工是在微軟的官方博客 [2]上這麼說的:

Everybody (to within experimental error) refers to 1024 bytes as a kilobyte, not a kibibyte. If Explorer were to switch to the term kibibyte, it would merely be showing users information in a form they cannot understand, and for what purpose? So you can feel superior because you know what that term means and other people don』t.

大噫就是:

公認1024 byte = kilobyte,而不是kibibyte。所以堅持kilo-不等於1024的人會有優越感,因為其他人不知道。

(這個員工本身也知道這個問題的所在,但是內心可能卻是在想:「你們這些認為kilo-不等於1024的人是在裝逼嗎?」 凸顯了大公司的傲慢和自大。)

當謊言說上一千遍,那便成為了真理。

當Windows被安裝上十億次,Kilo-便成為了1024。

Reference:

[1] StrFormatByteSizeA function (Windows)

[2] Why does Explorer use the term KB instead of KiB?

[3] Metric prefix

[4] IEEE 1541-2002

最後吐槽一下:一些可能是培訓班出來的程序員只知道一種容量單位,還是錯誤的單位,他們管4 GB U盤叫4 GB,管4 GiB內存條也叫4 GB。

然而兩者的容量差異非常巨大,一個4 GiB內存的計算機經常是除去核顯佔用的內存後,整塊內存也無法完整地轉儲進一個4 GB的U盤。

如果把1024 Bytes叫作1 KB,那麼1000 Bytes還能擁有屬於它自己的名字嗎?

-------------------

歷史就是歷史,不能虛構,作為單位時K = kilo = 1000的歷史是計算機的歷史的數倍之長,這是可以考證的、毋庸置疑的事實。但是寫下這個答案,也只是希望各位在加入1500萬用戶的Ubuntu大家庭,或者7500萬用戶的OS X大家庭時,能減少一些疑惑。

或許等各位讀完其他比較煽情的答案後,能坐下來想想:為何在Windows安裝量遠超10億的2002年,IEEE的眾多專家還要聯合制定標準,堅持K=1000呢?


@蔣大旺已經說清楚了。對於外存儲設備,基本上標示容量都是按1000來計算的(1KB=1000B...),但對於Windows等操作系統,是按1024來計算的(1KB=1024B)。

對於1TB的容量,這會導致顯示容量只有標示容量的90%:

1000^4/1024^4approx 0.9

格式化之後,文件系統會佔用額外的空間,用於存放元數據等內容,實際可用容量會變得更小。


操作系統,比如微軟的演算法是1024,移動硬碟撒啥的是以1000為標準,so……你換算下就知道了


很簡單,換算不一樣,廠商是1000進位,電腦計算是1024進位,標示容量會縮水7%


硬碟廠商:因為1KB=1000B好算而且規則,所以用了這種方式。

操作系統:為了減少轉化直接二進位定址這樣的話就是1K=1024B.


補張圖

對於文件的顯示仍舊是按1024來的。

綜合來看,OSX的「人性化」也是有隱患的。最好要麼MiB,MB全部分清,要麼像MS統一1024為K,不然會暗藏一些坑。

================以下原答案================

最近裝了黑蘋果,我來給@林燦斌補一張圖

那麼圖中,3.5GB和128MB用得正確嗎?

我不否認磁碟空間表示上,OSX用的GB的確是和windows不同(我還鬱悶了好一會兒),而且的確我覺得這種表示很有意思挺人性化。

但是我上這圖的意思是,GiB還是GB,到底和實際意思有沒有出入,這不那麼重要,就像下載的載第幾聲,不那麼重要。

對於內存這類考慮到二進位對應比較方便的東西,K用1024,硬碟等早年按照1000為單位的,K就是1000。OSX在這一點上做了區分,雖然並沒有嚴格使用了GiB,但的確挺人性化,比win厲害。

另外插一句,u盤、固態這種用了nand的存儲設備,理論上應該也是按照1024=K來設計啊(難道拿出一塊1000bytes的nand?),但是最後標示成1000=K,估計是壞塊被吃了或者被主控扣下來當OP了吧。

所以同樣標示為8G的優盤,實際格式化完容量有些許區別,甚至大於7.4506GiB也是不足為奇的。


還需要格式化建議文件系統,這需要向組織交點費用!交足上頭的,剩下的才是自己的。


都在說1024的問題,還有一個關鍵是ECC


要麼說服硬碟商使用你們的標準,要麼你們使用硬碟商的標準。要麼別讓他們出現在同一台計算機裡面。

歷史只是這件事情的成因,不能說明這種狀態是合理的。幾十年的時間,不能說沒有機會去統一這個標準吧!


商家標註:1MB=1000KB(以1000為單位)

微軟系統:1MB=1024KB(以1024為單位)


很簡單的換算問題

1000進位 和1024進位

微軟弄出來的問題


沒人回答是文件系統占的容量么…


尺了不一樣


推薦閱讀:

Windows7操作系統下磁碟分區怎樣管理最科學?
7200轉或5400轉的移動硬碟差別大么?
怎樣完整備份windows計算機的硬碟?
sata2介面的電腦有必要上SSD嗎?
硬碟主分區,擴展分區,邏輯分區,動態分區這些名稱都是什麼意思?

TAG:計算機 | 硬體 | 硬碟 | Android | 數據存儲技術 |