運作方式
儲存單位有兩種數法,而且兩種都沒錯。硬碟廠商與國際單位制使用的十進位,每一級詞頭都乘以 1000:1 kB 是 1,000 位元組,1 MB 是一百萬,1 TB 是一兆。隨電腦而生的二進位則乘以 1024,因為記憶體與匯流排都以 2 的次方定址。
問題在於這兩套體系數十年來用的是同一批名稱。Windows 檔案總管寫著「GB」時,實際計算的是二進位十億位元組,也就是連除三次 1024。所以一顆剛好裝著一兆位元組的 1 TB 硬碟,在螢幕上顯示成 931.32 GB:什麼都沒少,只是換了一把尺。1998 年起,IEC 80000-13 標準以二進位詞頭 KiB、MiB、GiB、TiB 解決了這個歧義。
這個工具會把容量同時換算到三套體系——十進位、二進位與位元,並列出精確的位元組數、廠商標示的數字,以及作業系統將顯示的數字和兩者的百分比差異。所有計算都在瀏覽器中完成。
範例
1 TB931,32 GB硬碟裡剛好有包裝盒承諾的 1,000,000,000,000 位元組。系統連除三次 1024 後顯示 931.32 GB,嚴格說是 931.32 GiB。螢幕上看起來少了將近 69 GB,硬碟上卻一個位元組都沒少。1 GiB1073741824 B1 個二進位十億位元組是 2^30 位元組,而十進位的十億位元組是 1,000,000,000,所以二進位的大 7.37 %。你說「一個 G」時心裡想的量,和每個程式理解的量,差的就是這個數。4 TB3,64 TiB詞頭越大,兩套體系差得越遠:千級 2.34 %、十億級 6.87 %、兆級 9.05 %。所以「硬碟怎麼這麼小」的感覺,反而在大容量硬碟上更明顯。100 Mbit12,5 MB網路線路以位元計算,儲存以位元組計算。100 Mbit/s 的線路每秒最多下載 12.5 MB,因為每個位元組是 8 位元。光是這道換算,就能解釋一半對電信業者的抱怨。使用情境
- 弄懂 1 TB 的硬碟或 64 GB 的隨身碟為什麼顯示的容量比包裝上寫的少。
- 把 API、記錄檔或 ls -l 指令回傳的位元組數換成看得懂的單位。
- 在兩個用不同尺度計算的工具之間,比較備份或映像檔的大小。
- 當文件寫 MiB 而介面寫 MB 時,估算配額、磁碟區或上傳上限。
- 把線路速率 Mbit/s 換算成真正的下載速度 MB/s。
- 用數字向客戶說明,他買的硬碟並沒有比承諾的容量少。
常見問題
我買了 1 TB 的硬碟,卻只看到 931 GB,是被騙了嗎?
沒有。硬碟裡有 1,000,000,000,000 位元組,而在所有廠商使用的十進位體系中,這正是 1 TB 的意思。Windows 拿同樣的位元組連除三次 1024,得到 931.32,卻把結果標成「GB」而不是「GiB」。這是標示的問題,不是容量的問題:位元組一個都沒少。真正會少掉的是另一回事——格式化時檔案系統保留的空間。
GB 和 GiB 有什麼差別?
1 GB 是 1,000,000,000 位元組(10^9),1 GiB 是 1,073,741,824 位元組(2^30),後者大 7.37 %。同樣的比例在每一級都會重複:kB 對 KiB、MB 對 MiB、TB 對 TiB。二進位符號中間多一個「i」,唸作 kibi、mebi、gibi、tebi。
所有作業系統顯示的都一樣嗎?
不一樣,這讓人更混亂。Windows 以 1024 的次方計算,卻標成 GB 與 TB,所以 1 TB 的硬碟顯示成 931 GB。macOS 自 2009 年起以十進位計算,同一顆硬碟就顯示成 1 TB。Linux 則要看工具:df -h 與 ls -lh 用 1024,df -H 與 ls -l --si 用 1000,許多工具在該寫 GiB 的地方已經寫 GiB。硬碟從沒變過,變的是量它的人。
為什麼記憶體容量和包裝上寫的一致?
因為記憶體是以 2 的次方製造與定址的:一條「16 GB」的記憶體實際上是 16 GiB,也就是 17,179,869,184 位元組。作業系統同樣以二進位計算,兩個數字自然吻合,沒有人會察覺。硬碟正好相反:廠商用十進位、系統用二進位,差距一眼就看得出來。
差異會隨詞頭增加多少?
每升一級累積 2.4 %。系統顯示的數字在千級小 2.34 %、百萬級小 4.63 %、十億級小 6.87 %、兆級小 9.05 %、千兆級小 11.18 %、百萬兆級小 13.26 %。所以幾 kB 的檔案感覺不到差異,而在好幾 PB 的陣列上就是數百 TB 的心理落差。
Mbit 和 MB 是同一回事嗎?
不是,差了八倍。網路線路以每秒位元計算,儲存以位元組計算,而 1 位元組是 8 位元。300 Mbit/s 的線路最多提供 37.5 MB/s 的下載速度,這還沒扣掉各層協定的標頭。而且網路詞頭永遠是十進位:1 Mbit 是一百萬位元,絕不是 1,048,576。
為什麼我的 SSD 空間又更少?
在十進位與二進位的差異之外,還要再加兩件事。第一是預留空間(over-provisioning):主控會保留一部分使用者用不到的快閃記憶體,用來替換磨損的區塊並加快寫入。第二是檔案系統,一格式化就會在表格、日誌與中繼資料上佔掉空間。這兩者都不是故障,而是硬碟能正常運作、能用得久的代價。
那麼撰寫文件時該用哪種單位?
用不會讓人誤會的那一種。數值若以 1024 的次方計算,就寫 MiB 或 GiB;若以 1000 的次方計算,就寫 MB 或 GB。在 API 或設定檔中,最保險的做法是直接提供位元組數,讓介面決定怎麼顯示。這一行程式碼能省下好幾個小時的爭論:為什麼兩個工具對同一個檔案報出不同的數字。