本集课程B站链接:
4. 二进制-Representing Numbers and Letters with Binary_BiliBili_哔哩哔哩_bilibili4. 二进制-Representing Numbers and Letters with Binary_BiliBili是【计算机科学速成课】[40集全/精校] - Crash Course Computer Science的第4集视频,该合集共计40集,视频收藏或关注UP主,及时了解更多相关视频内容。https://www.bilibili.com/video/BV1EW411u7th?p=4&vd_source=efc1c9272504933e74aad03c1db8271e
上集介绍了如何使用晶体管制作逻辑门,而且提到了布尔代数中只有True和False两个值,用数字可以表示为0和1,那我们怎样才可以表示出更多的信息呢?下面会给出答案。
1. 二进制数字
让我们想想在十进制中是如何表示更多的信息 —— 加位数。一个数字只能表示0~9,假如我们在前面加上一位,就能表示出0~99的数字,假如我们不断地在前面加位数,就可以表示出无穷无尽的数字。二进制也是同样,通过在前面添加位数,就可以表达更多的信息。
举个栗子,十进制数字263代表了什么?答:2个100、6个10和3个1的总和。
263 = 2 * 100 + 6 * 10 + 3 * 1
100's | 10's | 1's |
2 | 6 | 3 |
从上面的例子可以看出,每位都有不同的乘数,且高位比低位大10倍,因为每一位可以表示10个数字(0~9),只有超过9的才会加一位。这样基于每一位都有10个数字的计数方式,就是十进制了。
二进制也是一样的道理。在二进制中,每一位可以表示两个数(1和0),所以高位会比低位大两倍,也就是说,从低位到高位,每一位代表的数字就是1、2、4、8...,以二进制数字101举例,就是1个4,0个2,1个1的和,等于十进制中的5 。
4's | 2's | 1's |
1 | 0 | 1 |
再比如10110111,就是128*1 + 64*0 + 32*1 + 16*1 + 8*0 + 4*1 + 2*1 + 1*1 = 183
128's | 64's | 32's | 16's | 8's | 4's | 2's | 1's |
1 | 0 | 1 | 1 | 0 | 1 | 1 | 1 |
2. 二进制计算
还是十进制加法来举例,比如现在要计算183与19的和,在做加法时,首先将两个数字的相同位对其,然后从个位开始,每一位对应相加,如果加出来的结果大于10,就向下一位进一位:
把这套规则迁移到二进制中也同样适用:
3. 计算机中的二进制
在二进制中,每一位数(一个0或者一个1)被称为一个Bit(比特)。在上面的例子中,我们使用了两个8位的二进制数字进行加法运算。一个8bit的二进制数字可以表示的最小数字是0(即8位都是0),可以表示的最大数字是255(8位都是1),总共为2的8次方共256个数字。
在计算机中,每8位被称为一个Byte(字节),即1 byte = 8 bits。常见的储存单位如KB(千字节),MB(Mega--兆字节),GB(Giga--千兆字节)都是以字节为基本单位的。1 KB = 1024Bytes。
我们常听到的32-Bit或者64-Bit计算机,代表就是计算机一次处理的最大的数据量,即它一次可以处理4Byte(32bit)或者8Byte(64bit)的数据。32bit可以表示的最大数字为 4,294,967,295。
4. 负数的表示
并不是所有的数字都是正数,计算机会用第1位作为标志位来表示正负,1表示是负数,0表示是正数。例如一个32位的数,第一位表示正负,剩下的31位表示数字,能表示的范围就大概是 -2,147,483,648~2,147,483,648。虽然20亿是一个很大的数字了,但是在处理各种问题时明显还不够用。这时候就体现出64位的优势了,它能表示的最大有符号数字是9.2E+18。
5. 浮点数的表示
此外,计算机也要处理非整数,术语叫做浮点数,因为小数点可以在数字之间浮动。最常见的表述浮点数的方式是IEEE 754 标准,它以类似科学计数法的方式来存储十进制的值,比如625.9 可以写成0.6259E+3。其中.6259叫做有效位数,3叫做指数。
以32位浮点数举例,它将32位数设置成了1个正负标志位(S),8个指数位(E),23个有效数字位(M),所表述的数字。
6. 文字的表示
谈完了数字,文字是如何表示的呢? 计算机通过给每个字符编码的,用二进制来表示文字。1963年发明的 ASCII 码(American Standard Code for Information Interchange—美国信息交换标准代码)一直延用到现在。ASCII 码由7位二进制数表示,可以表达128个不同的字符,包括了大写字母、小写字母、数字0-9,大部分标点符号及一些换行符、制表符等特殊符号。一个字节有8位, ,多出来的128-255之间的字符是开放给其他国家使用的。
7. UNICODE
ASCII 码简单易用,它使用不长于一个字节长度的二进制编码来解决了字符的问题。但是,ASCII 码却有个明显的缺陷:假如一个国家的文字超出了一个字节能表达的范围不就完犊子了。为了解决这个问题,各个国家都研究了自己的多字节编码方案,但并不互相兼容,导致在不同系统之间,就会产生乱码问题。
1992年,Unicode 闪亮登场了,它统一了所有编码的标准,解决了不同国家不同编码标准的问题。常见的 Unicode 是16位的,可以表达超过一百万个字符,足够覆盖所有语言的每个字符了——100多种字母表占了12万个位置、剩下的还可以表示各种标点符号、数学符号、甚至 Emoji 表情!
8. 其他编码格式
除了 ASCII 码,Unicode 编码表示字符以外,还有其他常见的例如 MP3、PNG、MP4 等等各种编码格式,可以用来表达声音、图片、视频等信息。其实,我们每天在电脑上看到的照片、听到的音乐、看的电影、玩的游戏、浏览的网页(包括这次分享的博客)甚至我们用的操作系统,它们都是一串0和1长序列。这就像是用一种特殊的语言,让电脑能理解我们的意图,为我们创造出美好的体验。