前言:大二下要学计组,这是寒假自己在家学了前两章做的笔记,实际上啥用也没有,计组真抽象,这学期老师更抽象,剩下的章节可能会再出吧,以此来水我的第二篇博客😂😂😂
第一章 计算机系统概述
1.1 计算机发展历程
1.1.1 国外计算机发展概况
1.1.2 摩尔定律
- 当价格不变时,集成电路上可容纳的晶体管数量大约18—24个月翻一番,性能也将提升一倍,现已放缓至3年
1.1.3 集成电路工艺发展概况
1.1.4 我国计算机发展概况
1.2 计算机系统的组成
- 一台完整的计算机包括硬件和软件两部分,另外还有一部分固化的软件称为固件,其兼具二者特性,例如:BIOS
1.2.1 计算机硬件系统
- 存储程序:将解题的步骤编制成程序,然后将程序和运行程序所需要的数据以二进制形式放入到存储器中,方便执行
- 程序控制:计算机的控制器逐条取出存储器中的指令并按顺序执行,控制各功能部件进行相应的操作,完成数据的加工处理
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/0c393b3b5b151e1749513ecc27599109.png#pic_center)
-
冯·诺依曼体系结构:计算机的硬件系统包含运算器、控制器、存储器、输入设备和输出设备五大部件
-
中央处理器(CPU):运算器、控制器
-
主机(Host):CPU和存储器
-
输入输出设备/外部设备:输入设备和输出设备
1. 存储器
-
主要功能:存放程序和数据
-
程序是计算机操作的依据,数据是计算机操作的对象,都以二进制形式表示在存储器中
-
目前,计算机的主存储器都是半导体存储器。存储体由若干存储单元组成,信息按单元存放,每个存储单元对应一个编号,即单元地址,存储单元地址与存储在其中的信息一一对应,每个存储单元地址只有一个且固定不变,而信息可以改变。
-
访问存储器:向存储单元存入或从存储单元中取出信息
-
访问存储器时,先由地址译码器将送来的单元地址进行译码,找到相应的存储单元,然后由读/写控制电路确定访问存储器的方式(取出(读)或存入(写)),再按规定方式完成取出或存入操作。
-
地址总线为访问存储器传递地址信息,是单向的
-
数据总线为访问存储器传递数据信息,是双向的
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/d61d0fedd722083f87f49fa59d7be459.jpeg#pic_center)
2. 运算器
-
主要功能:用于信息加工处理的部件,对数据进行算数运算和逻辑运算
-
运算器常由算术逻辑单元(ALU)和一系列寄存器组成
-
ALU具体完成算数与逻辑运算,寄存器存放运算操作数,累加器除存放运算操作数之外,在连续运算中还用于存放中间结果和最后结果
-
寄存器与累加器中的原始数据既可从存储器中获得,也可以来自其他寄存器,累加器的最后结果既可存放到存储器中,也可送入其他寄存器
-
机器字长:运算器一次运算能处理的二进制位数,是计算机的重要性能指标,常用的有8位,16位,32位及64位
-
寄存器、累加器及存储单元的长度一般与机器字长相等
-
现代计算机的运算器具有多个寄存器,统称为通用寄存器组,设置通用寄存器组可以减少访问存储器的次数,提高运算器的运算速度
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/70f49ed648d6f481477ed51edb4e4079.jpeg#pic_center)
3. 控制器
-
主要功能:计算机的指挥中心,使各部件协调工作
-
工作实质就是解释程序,每次从存储器中读取一条指令,经过分析译码产生一串操作指令,再发给各功能部件控制各部件动作
-
计算机中流动的两股信息流:
-
控制流信息:即操作命令,分散流向各个功能部件,发源地是控制器
-
数据流信息:受控制流信息控制,从一个部件流向另一个部件,在流动过程中被相应的部件加工处理
控制器产生控制流信息的依据来自以下3个方面:
-
存放在指令寄存器中的机器指令,是计算机操作的主要依据
-
状态寄存器,用于存放反映计算机运行的状态信息
-
时序电路,产生各种时序信号,有序发送控制器的操作指令
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/9e14822d3fc1c731d191a4f813ba7221.png#pic_center)
4. 输入设备
-
输入设备就是将信息输入计算机的外部设备,常用的有鼠标、键盘、扫描仪及模/数(A/D)转换器
-
输入的信息有多种形式,送入计算机的只有一种形式,即二进制数据
-
一般输入设备用于原始数据和程序的输入
输入设备与主机之间通过接口连接,设置接口的原因:
-
输入设备大多是机电设备,传输数据的速度远远低于主机,需用接口进行数据缓冲
-
输入设备所用信息格式与主机不同,需用接口进行信息格式的转换
-
接口还可以向主机报告设备运行的状态、传达主机的命令
5. 输出设备
-
输入设备就是将计算机运算结果转换成人们和其他设备能接受和识别的信息形式的设备,需要通过接口与主机连接,常用的输出设备有打印机、显示器和模/数(A/D)转换器等
-
外存储器也是计算机中重要的外部设备,既可以作为输入设备,也可以作为输出设备,此外还有存储信息的功能,作为辅存使用,计算机的存储管理软件将它与主存一起管理,作为主存的补充,常见的外存储器有磁盘、光盘与磁带机,也要通过接口与主机连接。
-
通过输入设备将程序与数据存入存储器,计算机运行时,控制器从存储器中逐条取出指令,将它们解释成控制指令去控制命令各部件的动作,数据在运算器中被加工处理,处理后的结果通过输出设备输出。
6. 系统互联
-
计算机硬件系统各功能部件还需要有组织地以某种方式连接起来,从而实现数据流信息和控制流信息在不同部件之间的流动及数据信息的加工处理,使用较多的就是总线互连
-
总线(Bus):连接两个或多个设备/部件的公共信息通路,主要由数据线、地址线和控制线组成
-
系统总线:CPU连接计算机中各主要部件的总线
-
同一时刻只能允许一个设备向总线发送信息,但可以允许多个设备同时接收来自总线的信息
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/3434b19a8062f9c32bbb397b5edac660.png#pic_center)
1.2.2 计算机软件系统
-
计算机软件用程序描述解决问题的思想、方法和过程,程序是软件的核心组成部分,通常储存在存储介质中
-
软件系统:一台计算机中全部程序的集合
-
软件分为应用软件和系统软件
-
应用软件:用户为解决某种应用问题而编制的程序
-
系统软件:用于对计算机系统进行管理、调度、监视和服务,目的是方便用户、提高计算机使用效率、扩充系统的功能
通常将系统软件分为以下几类:
1. 操作系统
操作系统是管理计算器中各种资源、自动调度用户作业、处理各种中断的软件,管理的资源通常有硬件、软件和数据信息
常见的操作系统包括UNIX、Windows、Linux、Android、iOS等
2. 程序设计语言及语言处理程序
书写计算机程序的语言,通常分为3类:机器语言、汇编语言和高级语言
-
机器语言
用二进制代码表示的计算机能直接识别和执行的一种机器指令的集合,不同硬件结构的计算机的机器语言一般是不同的
-
汇编语言
用助记符表示的面向机器的计算机语言,汇编程序必须利用汇编器转换成机器指令才能执行
-
高级语言
与人类自然语言相接近且能为计算机所接受的,语义确定、规则明确、自然直观和通用易学的计算机语言,是面向用户的程序设计语言,需要通过相应的语言翻译程序才可变成计算机硬件能识别并执行的目标程序,根据执行方式可分为解释型和编译型
-
解释型语言:边解释,边执行,不生成目标程序,如Basic、Java语言
-
编译型语言:必须先将源程序翻译成目标程序才能执行,如C语言
-
语言编译程序:主要包括编译程序、汇编程序、解释程序和其他软件操作程序
-
编译器:即编译程序,负责将高级语言翻译成汇编代码
-
汇编器:即汇编程序,负责将汇编语言翻译成机器语言目标程序
-
解释器:即解释程序,用于将源程序中的语句按执行顺序逐条翻译成机器指令并执行,且不生成目标程序
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/c56329760d682a2421a5c523bda37d24.jpeg)
图1.6为常见的C语言源程序转换成最终目标程序的过程,处了常见的编译和汇编以外,还增加了预处理和多目标程序链 接的过程
3. 数据库管理系统
- 又称数据库管理软件,是为了满足数据处理和信息管理的需要,在文件系统的基础上发展起来的,在信息处理、情报检索、办公自动化和各种管理信息系统中起着重要的支撑作用。
- 常见的数据库管理系统包括Oracle、SQL Server、DB2、PostgreSQL、MySQL等
4. 应用程序
- 为实现某种特定应用而编制的程序,如文本编辑软件、聊天工具、浏览器、游戏等
1.3 计算机系统的层次结构
- 使用抽象的方法进行简化设计,借助分层抽象的方法对复杂系统问题进行求解,在抽象的最高层,可以使用问题环境的语言,以概括的方式叙述问题的解,在抽象的较低层,采用过程化的方式进行描述
1.3.1 系统层次结构
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/434a08d23167d79b98f097c51f5c0689.jpeg)
- 第6层是高级语言层,是面向用户的抽象层次,用户使用高级语言编程
- 第5层是汇编语言层,使用汇编语言编程
- 第4层是操作系统层,该层用于对计算机系统的硬件和软件资源进行统一管理和调度
- 第3层是指令集架构层,通过机器语言编写程序实现对计算机硬件的控制,也称为传统机器层或ISA层,是软件系统和硬 件系统之间的界面和纽带
- 第2层是微代码层,是实际的机器层,使用微指令编写微程序,由硬件直接进行,只有采用微程序设计的计算机系统才有这一层
- 第1层是逻辑门层,是计算机系统最底层的硬件系统
1—3层是硬件层,是计算机系统的基础和核心,计算机所有功能最终由硬件来执行,4—6层是软件层,第4层面向机器,第5、6层面向应用的
1.3.2 各层之间的关系
1.3.3 软件和硬件的逻辑功能等价性
1.4 计算机性能指标和评价
1.4.1 基本性能指标
1. 字长
- CPU一次处理的数据位数,用二进制数的长度来衡量,字长一般与计算机内部寄存器、运算器、数据总线的位宽相等
- 字长一般以字节(Byte)为基本单位,不同计算机字长可以不同,有的计算机支持变字长,如半字长、全字长、双字长和多字长等,都是字节的整数倍
字长对计算机性能的影响:
- 影响计算精确度,字长越长,计算精确度越高,反之亦然
- 影响数据的表示范围和精度,字长越长,定点数的表示范围越大,浮点数表示范围越大,精确度越高
2. 主存容量
- 主存能存储的最大信息量,一般用M×N表示,M表示存储单元数,也称字容量;N表示每个存储单元存储的二进制位数,也称位容量
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/5bf83d5c4e89a57f3b395dc3449f3d9e.jpeg)
- 增加主存容量能减少程序运行期间访问辅存的次数,有利于提高程序的执行速度,也有利于计算机性能的提高
1.4.2 与时间有关的性能指标
一段程序的执行往往要经过硬盘访问、内存访问、I/O操作、操作系统开销和CPU执行等多个阶段,因此一段程序的执行时间(也称响应时间)是由硬盘访问时间、内存访问时间、I/O操作时间、操作系统开销时间和CPU执行时间等几部分构成的
1. 时钟周期
- 计算机中最基本的、最小的时间单位,一个时钟周期内,CPU仅完成一个最基本的动作,其是时钟频率的倒数
2. CPI
-
执行每条指令所需要的时钟周期数
-
程序中包含的总指令条数用IC表示,程序执行所需时钟周期数为m,时钟周期为T,频率为f
-
C P I = m I C CPI=\frac{m}{IC} CPI=ICm
-
C P I = ∑ i = 1 n ( C P I i × P i ) = ∑ i = 1 n ( C P I i × I C i I C ) CPI=\sum\limits_{i=1}^{n}({CPI_i×P_i})=\sum\limits_{i=1}^{n}({CPI_i×\frac{IC_i}{IC}}) CPI=i=1∑n(CPIi×Pi)=i=1∑n(CPIi×ICICi)
3. CPU(执行)时间
-
CPU真正花费在该程序上的时间,包括用户CPU时间和系统CPU时间
-
T C P U = m × T = m f = C P I × I C × T = C P I × I C f T_{CPU}=m×T=\frac{m}{f}=CPI×IC×T=\frac{CPI×IC}{f} TCPU=m×T=fm=CPI×IC×T=fCPI×IC
CPU时间与以下因素紧密相关
- 时钟频率
- CPI
- 指令条数
4. IPC
- 每个时钟周期CPU能执行的指令条数,是CPI的倒数
5. MIPS
-
每秒百万条指令,即每秒执行完成的多少个百万个指令数量
-
M I P S = I C T c p u × 1 0 6 = f C P I = I P C × f MIPS=\frac{IC}{T_{cpu}×10^6}=\frac{f}{CPI}=IPC×f MIPS=Tcpu×106IC=CPIf=IPC×f
6. MFLOPS
-
每秒执行浮点运算次数,次数以百万为单位
-
M F L O P S = I C f l o p s T c p u × 1 0 6 MFLOPS=\frac{IC_{flops}}{T_{cpu}×10^6} MFLOPS=Tcpu×106ICflops
第二章 数据信息的表示
- 计算机内部流动的信息可分为数据信息和控制信息两类
- 数据信息:计算机加工处理的对象
- 控制信息:控制数据的加工处理
2.1 数据表示的作用
- 将数据按照某种方式组织起来,以便计算机硬件能直接识别运用
2.2 数值数据的表示
2.2.1 数的机器码表示
- 真值:用+/-表示数据的符号的数据书写格式
- 机器数/机器码:由符号和数值一起编码表示的二进制数
1. 原码
-
符号化的数值,正数符号位用0表示,负数符号位用1表示,其余位用该数的绝对值的二进制表示
-
对于数据0,原码有“+0”和“-0”两个编码
-
[ + 0 ] 原 = 00000 ⋅ ⋅ ⋅ 0 , [ − 0 ] 原 = 10000 ⋅ ⋅ ⋅ 0 [+0]_{原}=00000···0,[-0]_{原}=10000···0 [+0]原=00000⋅⋅⋅0,[−0]原=10000⋅⋅⋅0
2. 反码
-
又称1的补码,符号位与原码相同,真值为正数时,反码与原码相同;真值为负数时,反码数值位为真值数据位取反
-
对于数据0,反码也有“+0”和“-0”两个编码
-
[ + 0 ] 反 = 00000 ⋅ ⋅ ⋅ 0 , [ − 0 ] 反 = 11111 ⋅ ⋅ ⋅ 1 [+0]_{反}=00000···0,[-0]_{反}=11111···1 [+0]反=00000⋅⋅⋅0,[−0]反=11111⋅⋅⋅1
3. 补码
-
符号位与原码相同,当真值为正数时,补码符号位为0,数据位与真值相同;真值为负数时,补码符号位为1,数据位等于真值数据逐位取反,末位加1(反码法);或对真值数据位从右到左顺序进行扫描,右起第一个1及其右边的0保持不变,其余各位取反(扫描法)
-
补码的 0 表示唯一,多余的一个编码状态,定点小数中可表示 − 1 ,定点整数中可表示 − 2 n 补码的0表示唯一,多余的一个编码状态,定点小数中可表示-1,定点整数中可表示-2^n 补码的0表示唯一,多余的一个编码状态,定点小数中可表示−1,定点整数中可表示−2n
-
[ + 0 ] 补 = [ − 0 ] 补 = 00000 ⋅ ⋅ ⋅ 0 [+0]_补=[-0]_补=00000···0 [+0]补=[−0]补=00000⋅⋅⋅0
-
变形补码,也称双符号补码,采用两个二进制位来表示数据的符号,其余与补码相同,符号位为00时表示正数;符号位为11时表示负数,负数变形补码的数值位反码法和扫描法同样适用,运算时符号位最高位永远表示正确符号位,符号位01表示运算正溢出,符号位10表示运算负溢出
4. 移码
- 只用于定点整数的表示,可以直接比较大小,通常用于表示浮点数的阶码
移码的特点:
- 移码的符号位中0表示负数,1表示正数
- 同一数值的移码和补码符号位相反,数值位相同
- 移码中的的0表示也唯一,具体表示为10000···0
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/f7a954aec6c3443ac8d808cf309729fe.jpeg)
由4种机器码在数轴上的数据表示可知:
- 原码、反码的表示区间在数轴上是对称的,二者都存在+0和-0两个0
- 补码、移码的表示区间在数轴上是不对称的,0的表示是唯一的,它们相对原码和反码在数轴最左侧多表示了一个数
- 原码、反码、补码的符号位相同,正数的机器码相同
- 整数的补码、移码符号位相反,数值位相同
- 负数的反码、补码末位相差1
- 原码很容易判断大小,而负数的反码、补码很难直接判断大小,可采用的快速判断规则:数值部分越大,真值越大(越靠近0),绝对值越小。补码最大负数为全1,编码为1111,真值为-1,最小负数为1000,真值为-8
- 移码保持了原有大小顺序,可直接比较大小,全0的移码是最小数-8,全1的移码是最大数+7
2.2.2 定点数的表示
- 定点数表示法约定计算机中所有数据的小数点位置固定
- 由于小数点位置固定,因此小数点不必再用符号表示,其位置也无需储存
1. 定点小数
- 小数点的位置固定在数据的最高数位之前/符号位之后
2. 定点整数
- 小数点固定在最低位数之后
定点数能表示的数据范围的有关因素
- 机器字长。字长越长,表示范围越大
- 所采用的机器数表示法。补码、和移码能表示的范围比原码、反码多一个数
3. 定点数表示范围
若机器字长为 n + 1 ,则可表示 2 n + 1 个数据状态 若机器字长为n+1,则可表示2^{n+1}个数据状态 若机器字长为n+1,则可表示2n+1个数据状态
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/92886865b3eadc804c8f3a7580196ce4.jpeg)
- 溢出:数据超出计算机所能表示的数据范围
- 正上溢:数据大于最大正数
- 负上溢:数据小于最小负数
- 精度溢出:所有不在数轴刻度上的纯小数都超出了定点小数所能表示的精度,无法表示
2.2.3 浮点数表示
1. 浮点数的表示形式
-
浮点数:小数点位置不固定
-
任意一个二进制数都可表示成浮点数的形式:
N = 2 E × M = 2 ± e × ( ± 0. m ) N=2^E×M=2^{±e}×(±0.m)\\ N=2E×M=2±e×(±0.m) -
E是阶码,为定点整数;M是尾数,为定点小数。阶码的位数决定数据的表示范围,位数越多,表示范围越大,阶码的值决定小数点的位置:尾数的位数决定数据表示的精确程度,位数越多,精度越高。阶码和尾数均可采用不同机器码,对应的表示范围也不同。
2. 浮点数表示范围
- 正数最大值:阶码和尾数都为最大值
- 正数最小值:阶码和尾数都为最小值
- 负数最大值:阶码为最小值,尾数为负数最大值
- 负数最小值:阶码为最大值,尾数为负数最小值
受计算机字长限制,仍存在溢出现象:
- 正上溢:超出正数最大值
- 负上溢:超出负数最小值
- 正下溢:大于0小于正数最小值
- 负下溢:小于0大于负数最大值
发生上溢,浮点运算器显示溢出标志:发生下溢,数据不能精确表示,作机器0处理,发生精度溢出,用近似数表示
浮点数在数轴上的刻度不均匀分布,越往两端越稀疏
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/34cf2702b5fd82790a855df8dac3340c.jpeg)
3. 浮点数的规格化
- 目的:使表示形式唯一并进一步提高数据的表示精度
- 方法:使尾数真值最高有效位为1
- 左移规格化:将非规格化尾数进行算数左移,同时减少阶码值
- 右移规格化:将非规格化尾数进行算数右移,同时增加阶码值
- 隐藏位:
4. IEEE754 浮点数标准
- 主要包括32位单精度浮点数和64位双精度浮点数,分别对应C语言中的float型和double型
标准 | C语言类型 | 位宽 | 基数 | 阶码位数 | 阶码偏移值 | 尾数位数(不带数符) | 最大值量级 |
---|---|---|---|---|---|---|---|
单精度 | float | 32 | 2 | 8 | 127 | 23 | 1 0 38 10^{38} 1038 |
双精度 | double | 64 | 2 | 11 | 1023 | 52 | 1 0 308 10^{308} 10308 |
5. IEEE754 单精度浮点数
- 阶码E采用移码表示,偏移量是127(标准移码偏移量是128)。偏移量采用127的原因:保证任何一个规格化数的倒数都能用另一个浮点数表示,若采用128则最小规格化数的倒数会溢出。
- 尾数M为定点小数,用原码表示,小数点固定在M最左侧,小数点左边还有一个隐藏的1,所以尾数的实际有效位为24位,完整尾数形式为1.M,进行浮点数表示时只保存M,以提高精度
- S为浮点数符号位,也是尾数的符号位
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/5bdb9e94e6695d8c050330a7474a1ee9.jpeg)
- 阶码E为255时,浮点数可以表示无穷大或非数NAN
- 1≤E≤254时,浮点数为规格化数,公式为:
N = ( − 1 ) s × 2 E − 127 × 1. M N=(-1)^s×2^{E-127}×1.M N=(−1)s×2E−127×1.M
- E=0且M≠0时,浮点数为非规格化数,公式为:
N = ( − 1 ) s × 2 − 126 × 0. M N=(-1)^s×2^{-126}×0.M N=(−1)s×2−126×0.M
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/929d37c14940f79de334a3c2b9f817fb.jpeg)
- 浮点数在数轴上的分布不均匀,越往右越稀疏,蓝色阴影区域为非规格化数区域
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/f596bcbe7bf18da8dd9ae5329f8524af.jpeg)
- 浮点数加法运算不满足结合率,大数和小数相加时会发生精度溢出,小数被大数吸收
6. IEEE754 双精度浮点数
-
(与单精度浮点数相类似)
-
阶码的真值e的取值范围为:**-1022 ~ +1023,**偏移量为+1023,阶码移码编码E为:+1 ~ + 2046
-
双精度浮点数的规格化数表示为:
N = ( − 1 ) s × 2 E − 1023 × 1. M N=(-1)^s×2^{E-1023}×1.M N=(−1)s×2E−1023×1.M
- E=0或E=2047时,在IEEE 754标准中表示特殊的数
2.2.4 十进制编码*
1. 十进制整数
表示十进制整数有三种方法:
-
BCD码
用4位二进制数表示0—9这10个数,16种状态中选10种来表示,编码效率 10 16 \frac{10}{16} 1610,常见的有8421码、2421码、余3码
8421码:有权编码,0000—1001表示0—9,其余6种为非法编码
2421码:有权编码,0000—0100,1011—1111表示0—9,0101—1010规定不用
余3码:无权编码,对8421码每个码数加3形成
-
BID码
直接用二进制整数编码表示十进制整数,常用于十进制浮点数的尾数表示
-
DPD码
又称紧凑十进制编码,用十个二进制位表示3个十进制数,编码效率 1000 1024 \frac{1000}{1024} 10241000
3位十进制数转换成10位二进制编码是要根据每位十进制数字的大小选择不同的规则进行转换
10位二进制编码要转换成3位十进制数时要根据b6,b5,b3,b2,b1的值选择不同的规则进行转换
2. 十进制浮点数
二进制浮点数最大的问题就是不能精确表示十进制数
2.2.5 计算机中的数据类型
太烦了,不做了,以后需要用再回来做
2.3 非数值数据的表示
- 非数值数据无数值大小之分,也称字符数据,如符号和文字
2.3.1 字符表示
国际上广泛采用ASCII码,128个符号,使用7个比特位,字节最高位(MSB)为0
2.3.2 汉字编码
GB2312,国标码,双字节编码,双字节最高位都为1,实际使用14位表示汉字
区位码+A0A0H=GB2312编码
GB系列标准:GBK标准、GB2312标准、GB18030标准
Unicode标准:UTF、UNicode、UTF-8、UTF-16、UTF-32
1. 汉字处理流程
- 外码:汉字输入码,解决汉字输入计算机的编码,区位码、国际码、拼音码、电报码、表形码等
- 汉字机内码:计算机内部对汉字的统一编码,如GB系列标准、Unicode标准
- 汉字输入码将汉字输入计算机后,被转换成汉字机内码
2.4 数据信息的校验
- 校验码
- 具有发现错误或纠正错误能力的数据编码,提升数据在时间和空间两个维度上传输可靠性
-
-
2.4.1 码距与校验
- 码距:又称海明距离,即两个编码对应二进制位不同的个数
- 编码集的码距:该有效编码集中任意两个码字的最小码距
- 校验码的目的就是扩大码距,从而通过编码规则来识别错误代码
- 码距越大,抗干扰能力、纠错能力越强,数据冗余越大,编码效率越低
- 增大码距能把一个不具备检错能力的编码变成具有检错能力的编码
-
-
2.4.2 奇偶校验
- 通过检测二进制代码中1的个数的奇偶性
1. 简单奇偶校验
- 编码规则:增加一位校验位P,使得最终的校验码(包含原始数据和校验位)中数字1的个数为奇数或偶数(奇校验则是为奇数,偶校验则为偶数),其最小码距为2
- 能够检测出任意奇数位的错误,无法检测偶数位的错误
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/e7921e97233a2dffa20a163eada76ec5.jpeg)
2. 交叉奇偶校验
- 多重奇偶校验中最典型的例子:交叉奇偶校验
- 基本原理:将带编码的原始数据信息构造成行列矩阵式结构,同时进行两个方向的奇偶校验
-
- 交叉奇偶检验能检验出所有3位及3位以下的错误,奇数位错误,大部分偶数位错误,能纠正一位错误和部分多位错误,大大降低误码率
2.4.3 海明校验
- 本质上是多重奇偶校验,既能检错也能纠错的校验码
- 原始数据信息被分成若干个偶校验组,每组设置一个偶校验位,每个数据位都会位于两个以上的校验组以提高检错率,所有校验组的检错位的值构成检错码
- 检错码值为0表示大概率无错误,不为0时检错码的值表示出错位的位置
1. 校验位的位数
- 设海明校验码 H n ⋅ ⋅ ⋅ H 3 H 2 H 1 H_n···H_3H_2H_1 Hn⋅⋅⋅H3H2H1共n位,包含原始信息 D k ⋅ ⋅ ⋅ D 2 D 1 D_k···D_2D_1 Dk⋅⋅⋅D2D1共k位,称为(n,k)码,校验位分别是 P r ⋅ ⋅ ⋅ P 2 P 1 P_r···P_2P_1 Pr⋅⋅⋅P2P1,包含r个偶校验组,n=k+r。
- r个校验组的r位检错信息构成一个检错码 G r ⋅ ⋅ ⋅ G 2 G 1 G_r···G_2G_1 Gr⋅⋅⋅G2G1,假定0值表示无错,其他值表示海明码一位错的出错位置,则检错码可指出 2 r − 1 2^r-1 2r−1种一位错
n = k + r ≤ 2 r − 1 n=k+r≤2^r-1 n=k+r≤2r−1
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/f1f6302eb3fe5ff1c71a5c07ff371ed2.jpeg)
2. 编码分组规则
设k个校验位为 P r ⋅ ⋅ ⋅ P 2 P 1 P_r···P_2P_1 Pr⋅⋅⋅P2P1, n个数据位为 D k ⋅ ⋅ ⋅ D 2 D 1 D_k···D_2D_1 Dk⋅⋅⋅D2D1,对应的海明码为 H r + k , H r + k − 1 , ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ , H 1 H_{r+k},H_{r+k-1},······,H_1 Hr+k,Hr+k−1,⋅⋅⋅⋅⋅⋅,H1
校验码的位置都是基于 2^n
来确定的,如
P
i
P_i
Pi在海明码的第
2
i
−
1
2^{i-1}
2i−1位置,比如
P
1
,
2
1
−
1
=
1
,所以在
H
1
的位置
P_1,2^{1-1}=1,所以在H_1的位置
P1,21−1=1,所以在H1的位置,依此类推
校验位确定完后,依次按顺序填入数据位信息 D k ⋅ ⋅ ⋅ D 2 D 1 D_k···D_2D_1 Dk⋅⋅⋅D2D1
计算校验位
这里主要讲一种简易的计算校验位的方法:
第一个校验位
P
1
是位于
H
1
的位置,它检验的位置是
H
1
,
H
3
,
H
5
,
H
7
,
H
9
,
H
1
1
,也就是读一位,隔一位
第一个校验位P_1是位于H_1的位置,它检验的位置是H_1,H_3,H_5,H_7,H_9,H_11,也就是读一位,隔一位
第一个校验位P1是位于H1的位置,它检验的位置是H1,H3,H5,H7,H9,H11,也就是读一位,隔一位
第二个校验位
P
2
是位于
H
2
的位置,它检验的位置是
H
2
,
H
3
,
H
6
,
H
7
,
H
1
0
,
H
1
1
,也就是读两位,隔两位
第二个校验位P_2是位于H_2的位置,它检验的位置是H_2,H_3,H_6,H_7,H_10,H_11,也就是读两位,隔两位
第二个校验位P2是位于H2的位置,它检验的位置是H2,H3,H6,H7,H10,H11,也就是读两位,隔两位$第三个校验位P_3是位于H_4的位置,它检验的位置是H_4,H_5,H_6,H_7,H_12,也就是读四位,隔四位
第四个校验位
P
4
是位于
H
8
的位置,它检验的位置是
H
8
,
H
9
,
H
1
0
,
H
1
1
,
H
1
2
,也就是读八位,隔八位
第四个校验位P_4是位于H_8的位置,它检验的位置是H_8,H_9,H_10,H_11,H_12,也就是读八位,隔八位
第四个校验位P4是位于H8的位置,它检验的位置是H8,H9,H10,H11,H12,也就是读八位,隔八位以此类推,就可以轻易得知,第n位校验位校验的海明位是,从自身开始,读2{n-1}位,隔2{n-1}位,·····,直到读到尽头。$
![image-20240124223957777](../AppData/Roaming/Typora/typora-user-images/image-20240124223957777.png)
2.4.4 循环冗余校验(CRC)
1. 模2运算
- 模2加、减法运算相当于异或运算
- 0±0=0,0±1=1,1±0=1,1±1=0
- 模2乘法运算
- 部分积之和根据模2加法运算求,运算过程中不考虑进位
-
- 模2除法运算
- 根据模2减法求部分余数
- 部分余数首位为1时,商上1,按模2运算减除数
- 部分余数首位为0时,商上0,减0
- 部分余数位数小于除数位数时,该余数为最后余数
-
- 根据模2减法求部分余数
2. 编码规则
设
C
R
C
码长度共
n
位,其中原始数据信息为
C
k
−
1
C
k
−
2
⋅
⋅
⋅
C
1
C
0
共
k
位,校验位
P
r
−
1
P
r
−
2
⋅
⋅
⋅
P
0
共
r
位,称为(
n
,
k
)码,
则
C
R
C
码为
C
k
−
1
C
k
−
2
⋅
⋅
⋅
C
1
C
0
P
r
−
1
P
r
−
2
⋅
⋅
⋅
P
0
,
和海明码相同,也满足以下关系式:
设CRC码长度共n位,其中原始数据信息为C_{k-1}C_{k-2}···C_1C_0共k位,校验位P_{r-1}P_{r-2}···P_0共r位,称为(n,k)码,\\则CRC码为C_{k-1}C_{k-2}···C_1C_0P_{r-1}P_{r-2}···P_0,和海明码相同,也满足以下关系式:
设CRC码长度共n位,其中原始数据信息为Ck−1Ck−2⋅⋅⋅C1C0共k位,校验位Pr−1Pr−2⋅⋅⋅P0共r位,称为(n,k)码,则CRC码为Ck−1Ck−2⋅⋅⋅C1C0Pr−1Pr−2⋅⋅⋅P0,和海明码相同,也满足以下关系式:
n
=
k
+
r
≤
2
r
−
1
n=k+r≤2^r-1
n=k+r≤2r−1
- (1)对于一个给定的(n,k)码,假设待发送的k位二进制数据用信息多项式M(x)表示,有:
M ( x ) = C k − 1 x k − 1 C k − 2 x k − 2 + ⋅ ⋅ ⋅ + C 1 x + C 0 M(x)=C_{k-1}x^{k-1}C_{k-2}x^{k-2}+···+C_1x+C_0 M(x)=Ck−1xk−1Ck−2xk−2+⋅⋅⋅+C1x+C0
- (2)将M(x)左移r位,可表示成M(x)· 2 r 2^r 2r,右侧空出的r位用来放置校验位
- (3)选择一个r+1位的生成多项式G(x),其最高次幂等于r,最低次幂等于0
- (4)用M(x)· 2 r 2^r 2r按模2运算规则初一生成多项式G(x)所得的余数R(x)作为校验码。设商为Q(x),将余数R(x),放置到M(x)· 2 r 2^r 2r右侧空出的r位上,就形成了CRC校验码
M ( x ) ⋅ 2 r + R ( x ) = [ Q ( x ) G ( x ) + R ( X ) ] + R ( X ) = Q ( x ) G ( x ) + [ R ( X ) + R ( x ) ] M(x)·2^r+R(x)=[Q(x)G(x)+R(X)]+R(X)=Q(x)G(x)+[R(X)+R(x)] M(x)⋅2r+R(x)=[Q(x)G(x)+R(X)]+R(X)=Q(x)G(x)+[R(X)+R(x)]
- 按照模2运算规则,R(x)+R(x)=0,所以
M ( x ) ⋅ 2 r + R ( x ) = Q ( x ) G ( x ) M(x)·2^r+R(x)=Q(x)G(x) M(x)⋅2r+R(x)=Q(x)G(x)
- 上式表明,CRC码一定能被生成多项式G(x)整除