计算机组成
以下均为个人理解!
计算机就是计算的机器(现实可生产的机器),既然是计算,首先需要确定使用的进制(日常使用十进制,有十种连续的状态),前人通过长时间摸索,发现使用二进制是最划算最容易制造的进制(只需要有两种状态,开关或者高低电)。 在第三节会展示计算机是如何表示二进制的。
使用二进制进行计算,需要哪些部分呢?
例如给你纸笔,要求你计算2+2的结果:首先大脑进行计算得出结果4,然后把4写在纸上,别人需要的时候可以告诉他人是4,也能将纸展示给他看,其实计算机也需要这些步骤。
首先需要可以计算的部分(大脑),然后计算结果需要存储起来让可以以后使用(纸张),还需要人类能控制计算机和查看计算机的部分(接受命令和展示纸张内容),多台计算机的数据需要能够通信(告诉他人数据)。这四个要求可以简单划分计算机的组成部分。
根据以上过程,个人将计算机组成分为四大部分:
- 数据计算部分(计算单元)
- 数据存储部分(数据单元)
- 数据传输部分(传输单元)
- 外围组成(如数据输入:键盘鼠标,数据展示:显示器)
1. 数据单元
我们需要将现实生活中的信息用二进制表示,让计算机能够识别处理。
现实生活中,我们有数字,文字,图片,声音,图像等信息,需要通过指定形式转化为二进制存储到计算机中的数据单元,直白的说就是使用特殊格式代表不同内容。
进制的转换请自行学习。
1.1 表示数字
1.1.1 正整数
直接将十进制转换为二进制
1.1.2 负整数
我们可以获取对应的正整数,然后在前面添加一个符号位,这样可以表示对应的负整数。这种方法简单直接,但有个问题,数字是需要计算的,负数和正数的计算会变得复杂。
相反数之和在数学逻辑上是0,所以我们可以对二进制表示的正数取反(例如0000 1010表示10,取反就是1111 0101),这样两数之和就全为1,如果两数之和再加一,不就是0了(变成了1 0000 0000,如果我们规定一个数只有8位二进制,那么超出的1就会被丢弃)。符合数学逻辑,这样负数和正数的计算就不成问题。所以正数取反加一就可以表示对应的负数,这就被称为补码(10 的补码为 1111 0110)。
1.1.3 实数
其实就是小数的表示。
例如 : -13.14 我们可以写成 -1314*10^-2,这个小数有符号(-),有效数(1314)和底数10,指数(-2)构成。计算机保存小数需要使用二进制存储起来,一样是三部分存储:符号,指数,尾数。底数就是进制数,可以不保存。
指数会有复数,可以将所有指数统一添加指定大小( 称为偏移量 ,添加数字的大小是指数位数 2^(n-1)-1 如:八位大小的指数就是 2^7-1=127),让指数都确保为正数 方便后期计算 ,后期展示的时候指数在减去偏移量展示。这就是余码表示。
保存小数有一个精度(表示可以保存多少位小数),IEEE(电气电子工程师学会)有一个标准:
如何使用单进度表示 -13.14?
首先 将数字转化为二进制 -1101.1110
接着 移动小数点,是小数点左边只有一个1 -1.1011110 * 2^3
然后 指数3添加偏移量127变成130
然后 保存符号(负数为1)指数(130二进制是1000 0001)尾数(101111 小数点前的1省略,因为小数点前肯定存在1)
结果为 1 1000 0001 1011 11
1.2 表示文本
可以将字符对应指定的二进制数,这样就可以表示文本。这就是编码表。
ASCII编码表:是最早的编码表,由8个二进制位组成,可以表示256个字符,英文字符只用到了0-127的长度。
ASCII表示英文是足够了,但是计算机发展迅速,如果要表示中文,韩文,日文,这就远远不够了,所以需要将全球的字符都统一起来,每个字符都设置唯一的二进制数进行编码,以满足跨语言、跨平台进行文本转换、处理的要求。这就是Unicode编码。
Unicode一共有17组16位二进制组成(0x0000 至 0x10FFFF),每组65536个字符,一共可以表示17*65536=1114112,一百多万个字符。在表示一个Unicode的字符时,通常会用“U+”然后紧接着一组十六进制的数字来表示这一个字符。Unicode字符对应的唯一二进制码(唯一的二进制码又称为码点)的范围是U+0000 ~ U+10FFFF。U+0000 ~ U+FFFF 是基本平面/BMP,其他是辅助平面/SMP。
现在Unicode对每个字符都有唯一编码了,如何对这些编码区隔开可以正确读取到对应字符呢?
我们Unicode编码最长18位二进制码,我们可以使用大于18位的长度存储,比如使用32位二进制数存储,一共4个字节转化为一个字符,这就是UTF32。但是我们日常使用的字符并不需要这么多,这样存储太浪费内存容量了。比如我们常用的汉字在U+4E00…U+9FA5这个范围,这个范围是只是“中日韩统一表意文字”这个区间,但这不是全部,如果要全部包含,则还要他们的扩展集、部首、象形字、注间字母等等(2E80-A4CF 加上 F900-FAFF 加上 FE30-FE4F),一共只需要16个二进制数,一般2个字节就可以存储。所以就有了UTF8。
UTF8简单的说就是将要存储的Unicode编码判读需要几字节存储,如果一个字节,那就以0开头,如果是多个字节,就以对应字节数的1加上0开头(如果需要三个字节存储,就以1110开头,后面的每个字节前以10开头,这样解析的时候防止我们新的编码和已有的Unicode编码冲突)。以此区隔不同长度编码,简化内存。
UTF8的编码规则:
① 对于单字节的符号,字节的第一位设为0,后面的7位为这个符号的Unicode码,因此对于英文字母,UTF-8编码和ASCII码是相同的。
② 对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10,剩下的没有提及的二进制位,全部为这个符号的Unicode码 。
举个例子:比如说一个字符的Unicode编码是130,显然按照UTF-8的规则一个字节是表示不了它(因为如果是一个字节的话前面的一位必须是0),所以需要两个字节(n = 2)。
根据规则,第一个字节的前 2 位都设为1,第3(2+1)位设为0,则第一个字节为:110X XXXX,后面字节的前两位一律设为10,后面只剩下一个字节,所以后面的字节为:10XX XXXX。所以它的格式为110XXXXX 10XXXXXX 。
Unicode编号范围与对应的UTF-8二进制格式 :
1.3 表示音频
我们只需要了解原理。
声音是连续的波,我们可以在一秒内对波取10个值存储(每0.1s保存当前声音的值),这样就可以近似得到声音。
如果我们每秒采样次数(称为采样率)越多,就越精确,。我们采样时表示的数也是有大小范围的(确定人耳可听到的频率范围的数字,数字越多越精确,我们可以将频率分为一万份,或者十万份,这就是采样得到的二进制数,称为样本位深度),这样我们每秒就能得到一串二进制数(称为位率=采样率*位深度)。例如:我们使用16位二进制表示位宽度(将频率分为六万多份),每秒采样4000次,这样秒就得到16*4000=640000byte约为78KB/s的数据。
1.4 表示图片
图片分为光栅图(每个的颜色使用一个数表示)和矢量图(使用公式绘制图片)。
-
光栅图
采样(扫描)一张图片,每英寸采样次数越多,越精确。每个像素点可以使用指定的二进制位数表示(这就是色彩深度),编码标准有PNG,JPEG等等,缺点是体积大,放大会失真(因为每个点都是一个像素,放大后变成一个个颜色方块)。
-
矢量图
并不存储图像的像素,而是存储绘制图像的公式及颜色等
编码标准:DWG、DXF等等
1.5 表示视频
就是一系列图像一张接一张地播放而形成的,我们将这些单个的图像称为帧。
从存储一幅图像变成了存储一堆图像。
编码标准:MPEG。
封装格式:AVI、RMVB、MP4、WMV等等,用来将视频文件(MPEG)和音频文件(MP3)融合到一起,这就是封装格式。