缘起
今天又被身边的朋友问到了,为什么他买的1TB的固态硬盘,实际空间只有931GB,是不是买到了假货……想到不久之前,还有一众计算机培训机构出来的小伙伴们,也不理解这个问题,那我正好借这个机会,梳理一下计算机的最基础的知识,正好也算是基础系列的开篇吧。
现实生活中的各种进制
进制,我的理解就是一种计数的“规则”,而为了人的使用方便而制定的。比如我们人,因为天生就有十根手指头,所以十进制就是人们最熟悉的,也是应用最广泛的进制。
当然,也有其他的进制,比如1天24个小时,那么“天”这个概念,就是24进制。1小时有60分,一分钟有60秒,这些又是六十进制。
当然,生活中还会存在一些其他的奇奇怪怪的进制,比如一副扑克牌54张,那么这就是54进制,1年365天,所以又是365进制等等。
总结成一句话,就是满XX就进一位,就是一种进制。
计算机与二进制
在计算机系统中(比如内存/硬盘的容量、内存地址、网络通信等等)都使用二进制。为什么是二进制而不是其它的进制?我想这是现代的计算机的硬件原理造就的。因为电路有且只有“通、断”两种状态(不严谨,暂且这么理解)也就是“0和1”两个最基础的状态,因此,使用二进制是为了方便计算机处理。
当然,二进制的效率并不一定是最好的,据说大毛曾经有过研究过三进制的计算机,我不是数学大佬,那些科学的论证也看不太懂,总之,目前整个世界最最主流的,还是处理二进制数据的计算机。
位(bit)和字节(Byte)和神秘的1024
位(英文:bit)翻译为比特,也比特币的比特:-)。在真实的世界,对一个数字,可以划分为个位、十位、百位、千位、万位……,我们祖先的伟大发明-珠算,每一列算珠就对应着不同的位。
对于计算机来说1比特就是最小的信息存储的单位,8个bit组成了一个字节(Byte)为什么是8个比特算1个字节?我没有仔细查证,但我想应该是最初的8080的CPU,或者FC的游戏机用的6502 CPU,一次最多能处理8个bit的数据,所以小时候也被称作8位机,而后来的世嘉MD 用的摩托罗拉68000系列的CPU,一次可以处理16bit的数据,外壳上还有着大大的16bit的标志,小时候也被叫做16位机。
总之,字节(Byte)是计算机能够处理的最小的信息单元了。一个字节由8个比特位组成,一个位只能包含0或1两个状态,组合下来,一个字节能表达的信息,用人类的十进制来说,就是0-255一共256种“状态”。
注意:比特(bit)和字节(Byte)都是字母B开头,通常用小写字母b表示比特,俗称小b,大写字母B表示字节,俗称大B。
有了字节的概念,后面又继续烧脑了。因为计算机的世界都是二进制的,所以在计算的时候,是以1024为进位的,我理解是210 =十进制的1024。所以计算机中的进制计算可以表示为:
1KB=1024Byte 1024KB=1MByte 1024MB=1GByte 1024GB=1TByte
注意:基础的单位,都是大B也就是字节。
容量减少之谜
回到最初的问题,为什么标注1TB的硬盘,实际可用空间只有931GB?因为设备厂商为了计算方便,也为了非计算机专业人员的理解,通常是用人们熟悉的1000作为进制的,而实际上上计算机的进制是以1024为基础的。我们可以换算一下:
厂商计算的方式:1TB:1000*1000*1000*1000=1000000000000(1千亿个字节)
换做计算机的1024进制就是1000000000000/1024/1024/1024约等于931.32 GB
这就是这个谜团的根源。其实,某些厂商会因为怕被投诉虚标容量,会用很小的字体在包装或者说明书上标识,只不过和很多保险条款一样,很难被发现,也很少有人注意,但不能说人家没声明...果然世界还是真实的呀。
另外:以上这些其实还适用于宽带的计算。比如某宽带号称300M(兆),其实也是有坑的。他们实际指的是300Mbit/秒的速率,注意是小b,也就是比特哟,而且再加上也是按照人们习惯的10进制算的,而实际的计算机浏览器或者其他下载工具,是按照计算机的1024进制,而且是大B来显示和计算的。
套用硬盘容量的的计算方法:
宽带厂商的标识,注意除8从比特换算成字节:(300*1000*1000)/8= 37500000字节/秒
计算机的方法:37500000/1024/1024约等于35.76MB/秒
也就是说,所谓300M的宽带,下载的速度最高也就35.76MB/秒。当然,这是极限理论速度,还要考虑到运营商通常不会告知的上行和下行(上传和下载)的带宽是不一致的,以及网络传输背后的延迟和各种损耗等等,通常在10%-20%左右吧,根据这些经验,所谓的300M的宽带,实际下载速度,即使连接了很快的网站,实际下载也就是25-30MB左右的样子,上传的话,一般就是下载速率的十分之一,所以上传也就2.5-3.0MB/s。你学废了吗:-p
后续的扩展
花了很大的篇幅和力气,终于搞清了一个看似稀松平常的问题。实际上通过这个小问题的细节,引出了计算机的位、比特、进制、1024、等等知识点。这些概念很容易混淆,但也是计算机的基础。有了这些最基础的概念,后续的十六进制、内存寻址和内容的操作、数据流等概念,以及引申出的序列化、反序列化等等概念。这一切后续概念的基础,都是以二进制的位,都是以字节为基础的。
能看到这里的各位,相信一定是看懂了,至少是对这些基础感兴趣的吧?欢迎大家多多点赞和评论哟。希望能帮到大家,与大家一起共勉!
参考信息
https://zhuanlan.zhihu.com/p/263043369