文章目录
1. 数制与编码
1.1 进制转换
注意:并不是所有的十进制都能转二进制,只有
1/2
、1/4
、1/8
…才能
1.2 BCD码(采用四位二进制数表示十进制数)
1.3 字符与字符串
1.4 奇偶校验(1位检错,不能纠错)
注意:
- 一种编码方式的码距很重要,用来衡量该方案是否有纠错能力。
- 奇偶校验,数据传输的过程中只传输数据,而不是
校验位+数据
。只有在接受数据后,才为数据加上校验位,然后进行判断是否发生错误
1.5 海明码(2位检错,1位纠错)
上述的海明码还不是实际的海明码,因为其只有检测一位错误的能力,实际上,海明码具有一位纠错,二位检错能力。是因为在其最高位还添加了一个校验位。如下图所示:
1.6 循环冗余码CRC(只能检错,纠错1位或多位由多项式决定)
注意:
- 在大量数据传送过程中,通常使用CRC校验,而不是奇偶校验或者海明码校验。实际上网络中的数据传输使用的就是CRC
- 在CRC中,接收端检测出错误后,有如下三种纠错方法:
- 请求重发
- 删除数据(触发自动触发)
- 通过余数值自行纠正
2. 数的表示与运算
* 数的分类
1. 按小数点的位置分
1. 定点数:平时写的小数,如 6.3
2. 浮点数:科学计数法表示的小数,如 3.14×10^6
2. 按符号分
1. 无符号数
* 注意:通常只有无符号整数,没有无符号小数。
2. 有符号数
2.1 定点数的表示与运算
2.1.1 定点数的表示
无符号定点数很简单,这里不做说明。下面讨论有符号定点数的格式:
2.1.1.1 有符号定点数格式
注意:
- 定点 整数和定点的默认小数点位置不一样。
- 有符号定点数的整数和小数部分是分开存放的,比如
19.12
,会分成19
和.12
分别单独存放。
2.1.1.2 数值的表示(原码、反码、补码、移码)
1. 原码:真值的绝对值
2. 反码:在原码的基础上,符号位不变,数值部分全部取反
3. 补码:在反码的基础上+1
4. 移码:在补码的基础上,将符号位取反
* 注意:
1. 正数的原码、反码、补码相同,移码是符号位取反。其他的按照上面的方式求。
2. 原码、反码、补码既能表示`定点整数`也能表示`定点小数`,而移码只能表示`定点整数`。
注意:在求原码的范围时,就是让所有位位1,然后求其值,所以能够取等于。
原码和反码对0
有+0
和-0
两种表达,实际上,+0 = -0 = 0
,只应该有一种表达,所以出现补码,补码的0
只有一种表现形式,空出来的一个位置,用来表示更小的一个负数。补码在比较大小时不方便,比较两个数时,应该是从高位到低位进行比较,数大的大。这样补码的数在比较大小时,刚好是个反的,所以,出现了移码。
其实,补码的出现不只是上面的这个原因,实际上原码在进行一个正数与负数进行加操作,即进行减法操作时会很麻烦,使用补码让减法操作变为加法操作,节省硬件成本,(降低ALU复杂度)。
练习:
2.1.2 定点数的运算
2.1.2.1 移位运算
2.1.2.1.1 算术移位
可以通过算术移位实现乘法:
2.1.2.1.2 逻辑移位
逻辑移位就是直接舍弃移掉的那一位。
2.1.2.1.3 循环移位
2.1.2.2 加减运算
2.1.2.2.1 原码的加减
因为计算机存放的都是补码,计算时都是根据补码计算的,原码我们只需要会手算就行。
2.1.2.2.2 补码的加减
2.1.2.2.3 溢出的判断
那么如何判断加减后是否溢出?
2.1.2.2.4 空间扩展的填充的数值
那么出现溢出后应该将空间扩展,比如1B
变为2B
。如何扩展?
2.1.2.3 乘法运算
2.1.2.3.1 原码的一位乘
原码的一位乘,意思是ALU在计算乘法的时候,是拆分成每次计算一位乘实现的。
若数值位有n位,则要进行n次一位乘和n次移位
才能得到结果。
2.1.2.3.2 补码的一位乘
补码一位乘和原码一位乘非常类似,只需要注意如下几个区别就行:
原码一位乘需要的寄存器机器字长为n+1
(单符号)或n+2
(双符号)【n指的是数值位数】;而补码一位乘需要的寄存器机器字长为n+2
(双符号),其中ACC
和X
多的一位是填充符号,而MQ
中多的一位是做辅助位。(计算机中寄存器的机器字长一般是一样的)
其计算过程如下:
2.1.2.3.3 小结
2.1.2.4 除法运算
2.1.2.4.1 原码除法
2.1.2.4.1.1 余数恢复法
注意:
- 乘法中,
X
存放的是被乘数,MQ
中存放的是乘数,最终得到的结果是ACC
存放积的高位,MQ
存放积的低位。- 除法中,
X
存放的是除数,ACC
中存放的是被除数,最终得到的结果是ACC
存放余数,MQ
存放商。
2.1.2.4.1.2 加减交替法
2.1.2.4.2 补码除法(加减交替法)
2.1.2.4.3 小结
2.1.3 定点数的强制转换
注意:短变长的时候是根据数的正负扩展的,而不是根据最高位扩展。
2.1.3 数据的存储与排列
数据的存储有两种模式:
- 大端模式:高位字节存放在低地址处
- 小端模式:高位字节存放在高地址处
现代计算机通常支持按字、半字、按字节寻址,但是最终都会转为按字节编址。如果一台计算机的存储字长为32位,则一个字 = 32bit
,半字 = 16bit
。则访问字转为字节时,是对应二进制数左移2位(32bit/8=2^2, 是2次方所以左移两位)
;同理半字转为字节是左移1位。下面是该例子的示意图:
数据在计算机的排列方式有两种:边界对齐和边界不对齐。
边界不对齐方式在访问一个字或者半字的时候可能需要访问两次存储体:
注意:
3. 边界对齐的方式是以半字为基本单位,凡是不足半字的一律按占半字的空间处理。【牺牲空间换时间】
4. 边界对齐的方式是以字节为基本单位。
2.3 浮点数的表示与运算
2.3.1 浮点数的表示
2.3.1.1 浮点数格式
定点数的格式,导致位数越多存放的数越大,如果是固定的位数,则其表示的数的范围是不变的。那么如果我们想在位数不变的情况下,增加数的表示范围,如何做到?这叫涉及到浮点数的表示。
通过上面的浮点数的格式可以看到,如果我们将尾数的位数变小,阶码的位数变大,则数的表示范围会变大。
2.3.1.2 浮点数的规格化
2.3.1.3 小结
2.3.2 浮点数标准(IEEE754)
我们知道浮点数分阶码和尾数,而阶码和尾数各占多少位?阶码和尾数具体分别用什么码表示?如果不能统一,那么不同计算机间的浮点数会存在差异。接下来介绍一种浮点数的统一标准:IEEE754
之前我们介绍的移码是在补码的基础上符号位取反,这是侠义上的移码,即特指偏移值为2^(n-1) 【其中n是机器字长】,将所有的数向数轴右边移动,最左边的-128变为0
, 目的是为了能直接比较数的大小**【将移码当作无符号数,然后就可以比较】**。下面是广义上的移码:
IEEE754标准:
注意:
- 规格化的浮点数是指:阶码部分E不全为1和不全为0【也就是去掉偏移值为
2^n-1
的两个反常值】,即1<=E<=254
- 非规格化的浮点数是指:阶码部分E全为1和不全为0【也就是偏移值为
2^n-1
的两个反常值】,即E=0 或 E=255
- 上面计算浮点数的真值的公式是针对于规格化的浮点数,才这样计算。
规格化的浮点数的最小值和最大值的范围如上图所示,那么在同样的IEEE75
标准下能不能表示更大或更小的浮点数?
实际上是能的,需要用到非规格化的浮点数:
2.3.3 浮点数的运算
2.3.3.1 浮点数的加减运算
十进制浮点数的加减过程如下:
二进制浮点数的加减和十进制非常类似:
二进制浮点数计算步骤中的舍入,常用两种方法:
2.3.3.2 (C语言)浮点数强制类型转换
2.3.3.3 小结
3. 算术逻辑单元(ALU)
3.1 算术逻辑单元
3.1.1 逻辑元件