MB、MiB与Mbps之间的区别与联系
这个话题的由头是在HCIE-Datacom试听课程中老师提到了以太网集线器(Ethernet Hub)可以工作在10BASE-T以太网中,而其中的数字10指的是带宽(Bandwidth)也就是数据传输速率为10 Mbit/s,也可以写作10 Mbps。这两者的M前缀都是mega的符号表示,mega等同于\(10^6\)。众所周知1 Byte = 8 bits,所以可以得出10 Mbit/s = 10/8 MB/s = 1.25 MB/s。
以上的推论看起来似乎没什么问题,但转念一想不对啊,我的概念里不应该是1 MB = 1024 KB = 1024*1024 B,这乘数\(10^6\)与\(2^{20}\)都不一样怎么能直接除8呢?于是转而Google之搞清楚了其中的细节对错:
- 老师是对的我是错的
- 历史原因这两单位容易被不规范使用(混用、误用)
1 MB = 1000 KB = 1000*1000 B1 MiB = 1024 KiB = 1024*1024 B
MB(megabyte)
megabyte是信息计量单位byte的倍数单位,多用于信息技术领域表示数据量1。其前缀mega是国际单位制(International System of Units,SI)规定的单位前缀,符号为M。因其换算关系为10的幂次,又被称为十进制前缀。
国际单位制由国际计量局(Bureau international des poids et mesures,BIPM)制定,查阅其官方网站和标准文档都有相关的描述
Decimal multiples and submultiples of SI units can be written using the SI prefixes listed below:
Name Symbol Multiplying factor quetta Q \(10^{30}\) ronna R \(10^{27}\) yotta Y \(10^{24}\) zetta Z \(10^{21}\) exa E \(10^{18}\) peta P \(10^{15}\) tera T \(10^{12}\) giga G \(10^{9}\) mega M \(10^{6}\) kilo k \(10^{3}\) hecto h \(10^{2}\) deca da \(10^{1}\) deci d \(10^{-1}\) centi c \(10^{-2}\) milli m \(10^{-3}\) micro µ \(10^{-6}\) nano n \(10^{-9}\) pico p \(10^{-12}\) femto f \(10^{-15}\) atto a \(10^{-18}\) zepto z \(10^{-21}\) yocto y \(10^{-24}\) ronto r \(10^{-27}\) quecto q \(10^{-30}\)
MiB(mebibyte)
mebibyte同样是信息计量单位byte的倍数单位,其前缀mebi是国际电工委员会(International Electrotechnical Commission,IEC)规定的单位前缀,符号为Mi,由国际单位制(International System of Units,SI)的十进制单位前缀mega衍生而来,词源为megabinary。因其换算关系为2的幂次,又被称为二进制前缀。
该单位在 IEC 60027-2 标准中描述,该标准已被各国际组织广泛接受2,目前最新的版本是 IEC 60027-2:2019 。IEC 最早在 IEC 60027-2:1972/AMD2:1999 作出了明确定义并与国际单位制的十进制前缀区分。没有找到历史版本的文档可以下载,贴一个博客上看到的图3。另外该博主是在实际应用中发现的该问题,比较具有参考价值。

Mbps(megabit per second)
megabit per second与前两者不同,用于衡量数据传输速率,是bit per second的倍数单位。Mbps是其符号Mbit/s或Mb/s的常见缩写,其前缀mega同样是国际单位制(International System of Units,SI)规定的单位前缀,符号为M。bit per second的符号是bit/s,是bit与s的导出单位,同样具有二进制前缀的版本mebibit per second,符号Mibit/s。
以下是摘自维基的表格:
| Name | Symbol | Multiple | Multiple |
|---|---|---|---|
| bit per second | bit/s | 1 | 1 |
| Metric prefixes (SI) | |||
| kilobit per second | kbit/s | \(10^{3}\) | \(1000^{1}\) |
| megabit per second | Mbit/s | \(10^{6}\) | \(1000^{2}\) |
| gigabit per second | Gbit/s | \(10^{9}\) | \(1000^{3}\) |
| terabit per second | Tbit/s | \(10^{12}\) | \(1000^{4}\) |
| Binary prefixes (IEC 80000-13) | |||
| kibibit per second | Kibit/s | \(2^{10}\) | \(1024^{1}\) |
| mebibit per second | Mibit/s | \(2^{20}\) | \(1024^{2}\) |
| gibibit per second | Gibit/s | \(2^{30}\) | \(1024^{3}\) |
| tebibit per second | Tibit/s | \(2^{40}\) | \(1024^{4}\) |
实际验证
以上是标准制定的理想情况,实际上由于标准制定晚于实际应用,这是一个历史遗留问题,有许多场合存在单位的错用混用情况。为了防止大家错用单位,其实 SI 标准文档里在其单位前缀的描述部分还作了相应提示:
The 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).
有趣的是大部分人印象中的并不只是来源于教科书,还来源于生活日常使用各种软件。例如微软的1 MB = 1024 KB = 1024*1024 BWindows操作系统,同一个文件拷贝到macOS操作系统后变大、1TB容量硬盘显示只有930GB容量,就是因为Windows使用的是十进制前缀的符号TB、GB、MB、KB,换算关系则是用的二进制前缀的 \(2^{40}\)、\(2^{30}\)、\(2^{20}\)、\(2^{10}\)。而硬盘厂商和macOS则规范使用了单位与换算关系,所以一直都是巨硬错了,而不是硬盘厂商或苹果的macOS。(虽然微软已经在修正这个历史遗留问题了
有哪些事实没有一定计算机知识的人不会相信? - Qi K的回答 - 知乎 https://www.zhihu.com/question/288115796/answer/523089229
非常意外地发现很多软粉在评论区疯狂地为微软洗地???
如果你要教育我说微软这样改不符合用户习惯,有兼容性问题等等等等,我建议你免开尊口,因为微软已经在改了。我举一个例子:
StrFormatByteSizeA function (shlwapi.h) - Win32 apps
这是一个名叫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这种最不应该改的东西说改就改了,其余的还不改无非就是懒得动弹,或者傲娇而已。
博主顺道在macOS Monterey 12.6.6系统做了下验证:
首先查看man-pages描述
1 | $ man dd |
生成相应字节数的文件后分别在终端和访达查看
1 | $ dd if=/dev/zero of=1KiB.file bs=1k count=1 |
访达似乎对于小文件不愿意显示小数点后面的数字 
另外群晖的DSM操作系统里1TB硬盘和Windows一样也显示为930GB(\(10^9/2^{30}*10^3\))

说到这其实并没有完全的对与错,只需要在一些严肃的场合明确区分就没有问题了(o^^o)
Wikimedia Foundation (2023) Megabyte, Wikipedia. Available at: https://en.wikipedia.org/wiki/Megabyte (Accessed: 18 July 2023).↩︎
Wikimedia Foundation (2023) Megabyte, Wikipedia. Available at: https://en.wikipedia.org/wiki/Megabyte (Accessed: 18 July 2023).↩︎
Wang, W. (2022) 1K bit = 1024 bit?, 17哥. Available at: https://wangwei1237.github.io/2022/06/19/Does-1Kbit-equal-1024bit/ (Accessed: 19 July 2023).↩︎