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 B
1 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 B
Windows
操作系统,同一个文件拷贝到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).↩︎