工作原理
存储单位有两种数法,而且两种都没错。硬盘厂商和国际单位制使用的十进制,每一级词头都乘以 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 的 U 盘为什么显示的容量比包装上写的少。
- 把 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 的文件里差异察觉不到,而在几拍字节的阵列上就是几百太字节的心理落差。
Mbit 和 MB 是一回事吗?
不是,差了八倍。网络链路按每秒比特计量,存储按字节计量,而 1 字节是 8 比特。300 Mbit/s 的链路最多提供 37.5 MB/s 的下载速度,这还没扣掉各层协议的头部开销。而且网络词头永远是十进制的:1 Mbit 是一百万比特,绝不是 1,048,576。
为什么我的固态硬盘空间还要更少?
在十进制与二进制的差异之外还要再加两件事。第一是预留空间(over-provisioning):主控会留下一部分用户用不到的闪存,用来替换磨损的块并加快写入。第二是文件系统,一格式化就会在表、日志和元数据上占掉空间。这两者都不是故障,而是硬盘能正常工作、能用得久的代价。
那么写文档时该用哪种单位?
用不会让人误解的那种。数值如果按 1024 的幂计算,就写 MiB 或 GiB;如果按 1000 的幂计算,就写 MB 或 GB。在 API 或配置文件里,最稳妥的做法是直接给出字节数,让界面决定怎么显示。这一行代码能省掉好几个小时的争论:为什么两个工具对同一个文件报出不同的数字。