1
0
mirror of https://github.com/Didnelpsun/CS408.git synced 2026-11-01 21:07:12 +08:00
This commit is contained in:
Didnelpsun
2022-06-25 23:01:34 +08:00
parent 0c5238f35d
commit f2c41e48e9
4 changed files with 146 additions and 55 deletions

View File

@@ -70,7 +70,7 @@ $C.$状态寄存器
$D.$通用寄存器
解:$B$。汇编程序员可以通过指定待执行指令的地址来设置$PC$的值,状态寄存器、通用寄存器只有为汇编程序员可见,才能实现编程,所以不是完全透明的。而$IR$、$MAR$、$MDR$是$CPU$的内部工作寄存器,对程序员均不可见。
解:$B$。在计算机概念中透明是指看不到,而不是能看的很清楚,所以这个题目指用户看不到哪个寄存器。汇编程序员可以通过指定待执行指令的地址来设置$PC$的值,状态寄存器、通用寄存器只有为汇编程序员可见,才能实现编程,所以不是完全透明的。而$IR$、$MAR$、$MDR$是$CPU$的内部工作寄存器,对程序员均不可见。
## 计算机性能指标
@@ -116,7 +116,27 @@ $C.$指令集
$D.$计算机组织
解:$A$。$CPI$是执行一条指令所需的时钟周期数,系统结构、指令集、计算机组织都会影响$CPI$,而时钟频率并不会影响$CPI$,但可加快指令的执行速度。
解:$A$。$CPI$是执行一条指令所需的时钟周期数,系统结构、指令集、计算机组织都会影响$CPI$,而时钟频率并不会影响$CPI$,但可加快指令的执行速度(一秒内时钟周期增多)。
**例题** 下列说法中,正确的是()。
Ⅰ.在微型计算机的广泛应用中,会计电算化属于科学计算方面的应用
Ⅱ.决定计算机计算精度的主要技术是计算机的字长
Ⅲ.计算机“运算速度”指标的含义是每秒能执行多少条操作系统的命令
Ⅳ.利用大规模集成电路技术把计算机的运算部件和控制部件做在一块集成电路芯片上,这样的一块芯片称为单片机
$A.$Ⅰ、Ⅲ
$B.$Ⅱ、Ⅳ
$C.$Ⅱ
$D.$Ⅰ、Ⅲ、Ⅳ
解:$C$。Ⅰ会计电算化是指会计业务通过计算机计算来简化计算压力,属于数据处理方面,而科学计算是指科学研究的大数据计算方面。Ⅲ含义是指多少条指令而不是单指操作系统指令。Ⅳ这种集成运算器和控制器的芯片是$CPU$,而单片机不止包括$CPU$还包括一些外围接口,且运算能力不如$CPU$。
**例题** 下列关于“兼容”的叙述,正确的是()。

View File

@@ -92,7 +92,7 @@
+ 存储体:存储数据的主体,按地址存取。(相联存储器按内容访存)
+ $MAR$:($Memory\,Address\,Register$)存储地址寄存器,用于访存地址,经过存放地址译码后所选的存储单元。$MAR$位数反映存储单元个数的幂值,与$PC$(程序计数器)长度相等(因为都是指向内存地址),如$MAR$有$10$位,则有$2^{10}=1024$个存储单元。
+ $MDR$:($Memory\,Data\,Register$)存储数据寄存器,用于暂存要从存储器中读或写的信息。$MDR$位数=存储字长,一般为字节的二次幂的整数倍。
+ $MDR$:($Memory\,Data\,Register$)存储数据寄存器,用于暂存要从存储器中读或写的信息。$MDR$位数=存储字长,一般为字节的二次幂的整数倍。(存储字长不等于数据字长,数据字长是数据总线一次性传输的信息位数)
+ 时序控制逻辑:产生存储器操作时所需的各种时序信号。
存储器相关概念:

View File

@@ -30,23 +30,33 @@ $B.0\,1000\,0\,111\,1\,1\,11$
根据海明不等式,$2^r\geqslant k+r+1$,即$2^r\geqslant 8+r+1$,解得$r=4$,又需要全校验,所以$P_{13}$为全校验位。
所以校验位一共有$P_1$、$P_2$、$P_4$、$P_8$、$P_{13}$。
所以校验位一共有$P_1$、$P_2$、$P_4$、$P_8$、$P_{13}$($E_1$、$E_2$、$E_3$、$E_4$、$E_5$)。
因为数据从右到左,所以:
数据位|13|12|11|10|9|8|7|6|5|4|3|2|1
:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:
编码|$P_{13}$|$D_8$|$D_7$|$D_6$|$D_5$|$P_8$|$D_4$|$D_3$|$D_2$|$P_4$|$D_1$|$P_2$|$P_1$
编码|$P_{13}$|$P_{12}$|$P_{11}$|$P_{10}$|$P_9$|$P_8$|$P_7$|$P_6$|$P_5$|$P_4$|$P_3$|$P_2$|$P_1$
编码|$E_5$|$D_8$|$D_7$|$D_6$|$D_5$|$E_4$|$D_4$|$D_3$|$D_2$|$E_3$|$D_1$|$E_2$|$E_1$
位置二进制|1101|1100|1011|1010|1001|1000|0111|0110|0101|0100|0011|0010|0001
数值||1|0|1|0||1|0|1||1
接下来就只用求对应的$P$就可以了。
根据位置二进制,$P_1$验证地址第四位为$1$的数据,即$D_1$、$D_2$、$D_4$、$D_5$、$D_7$,$P_1=D_1\oplus D_2\oplus D_4\oplus D_5=1$。$P_2$验证地址第三位为$1$的数据,即$P_2=D_1\oplus D_3\oplus D_4\oplus D_6\oplus D_7=1$。$P_4$验证地址第二位为$1$的数据,即$P_4=D_2\oplus D_3\oplus D_4\oplus D_8=1$。$P_8$验证地址第一位为$1$的数据,即$P_8=D_5\oplus D_6\oplus D_7\oplus D_8=0$,$P_{13}=D_8\oplus D_7\oplus D_6\oplus D_5\oplus P_8\oplus D_4\oplus D_3\oplus D_2\oplus P_4\oplus D_1\oplus P_2\oplus P_1=0$,填入表格:
根据$P$位置二进制,$P_1$验证地址第四位为$1$的数据,即$D_1$、$D_2$、$D_4$、$D_5$、$D_7$,$P_1=P_3\oplus P_5\oplus P_7\oplus P_9\oplus P_{11}=D_1\oplus D_2\oplus D_4\oplus D_5\oplus D_7=1$。
$P_2$验证地址第三位为$1$的数据,即$P_2=P_3\oplus P_6\oplus P_7\oplus P_{10}\oplus P_{11}=1=D_1\oplus D_3\oplus D_4\oplus D_6\oplus D_7=1$。
$P_4$验证地址第二位为$1$的数据,即$P_4=P_5\oplus P_6\oplus P_7\oplus P_{12}=D_2\oplus D_3\oplus D_4\oplus D_8=1$。
$P_8$验证地址第一位为$1$的数据,即$P_8=P_9\oplus P_{10}\oplus P_{11}\oplus P_{12}=D_5\oplus D_6\oplus D_7\oplus D_8=0$。
$P_{13}=D_8\oplus D_7\oplus D_6\oplus D_5\oplus E_4\oplus D_4\oplus D_3\oplus D_2\oplus E_3\oplus D_1\oplus E_2\oplus E_1=0$,填入表格:
数据位|13|12|11|10|9|8|7|6|5|4|3|2|1
:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:
编码|$P_{13}$|$D_8$|$D_7$|$D_6$|$D_5$|$P_8$|$D_4$|$D_3$|$D_2$|$P_4$|$D_1$|$P_2$|$P_1$
编码|$P_{13}$|$P_{12}$|$P_{11}$|$P_{10}$|$P_9$|$P_8$|$P_7$|$P_6$|$P_5$|$P_4$|$P_3$|$P_2$|$P_1$
编码|$E_5$|$D_8$|$D_7$|$D_6$|$D_5$|$E_4$|$D_4$|$D_3$|$D_2$|$E_3$|$D_1$|$E_2$|$E_1$
数值|0|1|0|1|0|1|1|0|1|1|1|1|1
#### 循环冗余校验码
@@ -159,7 +169,7 @@ $D.X_1=1$
运算器结构:$ACC$与$MQ$相连,数据流是双向的,$ACC$与$ALU$相连,数据流是双向的,$X$的数据流向$ALU$。
此时$MQ=01011$,作为乘法单位的最后位为1,所以$ACC+=X$,从而$=00000+01101=01101$,这就是第一个的位积。
此时$MQ=01011$,作为乘法单位的最后位为$1$,所以$ACC+=X$,从而$ACC=00000+01101=01101$,这就是第一个的位积。
由于按照乘法规则,第二个位积计算时需要错位相加,计算机的处理方式是$ACC$和$MQ$的数据连在一起,全部逻辑右移一位(左边补$0$)。

View File

@@ -15,13 +15,13 @@
#### R进制
+ 基数:每个数码位所用到的不同符号的个数,r进制的基数$r$。
+ R进制转换为十进制:$K_nK_{n-1}\cdots K_2K_1K_0K_{-1}K_{-2}\cdots K_{-m}=K_n\times r^n+K_{n-1}\times r^{n-1}\cdots K_2\times r^2+K_1\times r^1+K_0\times r^0+K_{-1}\times r^{-1}+K_{-2}\times r^{-2}\cdots K_{-m}\times r^{-m}=\sum_{i=-m}^nK_i\times r^i$。
+ 基数:每个数码位所用到的不同符号的个数,$r$进制的基数$r$。
+ $R$进制转换为十进制:$K_nK_{n-1}\cdots K_2K_1K_0K_{-1}K_{-2}\cdots K_{-m}=K_n\times r^n+K_{n-1}\times r^{n-1}\cdots K_2\times r^2+K_1\times r^1+K_0\times r^0+K_{-1}\times r^{-1}+K_{-2}\times r^{-2}\cdots K_{-m}\times r^{-m}=\sum_{i=-m}^nK_i\times r^i$。
+ 二进制:$0$、$1$。
+ 使用二进制的原因:
1. 可使用两个稳定状态的物理器件表示。
2. $0$,$1$正好对应逻辑值假、真。方便实现逻辑运算。
3. 可很方便地使用逻辑门电路实现算术运算。
3. 可很方便地使用逻辑门电路实现算术运算。(物理部件性质决定)
+ 八进制:$0\sim7$。可以用下标方式表明,也可以用结束的$O$或开头的$0$表示。如$(1643)_8$、$01643$、$1643O$。
+ 十进制:$0\sim9$。可以用下标方式表明,也可以用结束的$D$表示,如$(1643)_{10}$、$1643D$。
+ 十六进制:$0\sim9$、$A$、$B$、$C$、$D$、$E$、$F$。可以用下标方式表明,也可以用结束的$H$或开头的$0x$表示。如$(1643)_{16}$、$0x1643$、$1643H$。
@@ -60,16 +60,18 @@
+ 分为整数部分和小数部分:$K=N+F$。
+ 首先把整数拿出来得到$N=K_n\times r^n+K_{n-1}\times r^{n-1}\cdots K_2\times r^2+K_1\times r^1+K_0\times r^0$。
+ 对这个数除以基数$r$,得到$X=K_n\times r^{n-1}+K_{n-1}\times r^{n-2}\cdots K_2\times r^1+K_1\times r^0$,这时候就会得到一个余数$K_0$。所以$N=rX+K_0$,这时候就能算出$K_0$这个位数了。
+ 同理再将得到的商$X$同样除以$r$,就能得到$K_1$,所以不断递归就会得到整数部分所有的$K_i$。
+ 同理再将得到的商$X$同样除以$r$,就能得到$K_1$,所以不断递归就会得到整数部分所有的$K_i$。商为$0$时结束。
+ 得到的$K_i$是从低位排到高位。
+ 对于小数部分$F=K_{-1}\times r^{-1}+K_{-2}\times r^{-2}\cdots K_{-m}\times r^{-m}$。
+ 对这个数乘基数$r$,得到$K_{-1}\times r^0+K_{-2}\times r^{-1}\cdots K_{-m}\times r^{-m+1}$,取这个常数$K_{-1}$就是想要的答案。将乘积减去这个整数部分得到后面处理的数据
+ 同理再将得到的数据不断乘基数,就能得到小数部分所有的$K_i$。
+ 同理再将得到的数据不断乘基数,就能得到小数部分所有的$K_i$。积为$1.0$时结束。
+ 得到的$K_i$是从高位排到低位。
+ 将整数和小数合在一起就是最后的结果。
+ 有时候小数会出现无法彻底转换的情况,需要考虑保留多少位。
同理也可以使用拼凑法将数字拼凑成对应的数值。这种方法对于只有整数的数值比较好用。
基本上都是十进制转为二进制,然后由二进制转为十六进制或八进制,具体转换过程见例题。
同理也可以使用拼凑法将数字相减拼凑成对应的数值。这种方法对于只有整数的数值比较好用。
$2^{12}$|$2^{11}$|$2^{10}$|$2^{9}$|$2^{8}$|$2^{7}$|$2^{6}$|$2^{5}$|$2^{4}$|$2^{3}$|$2^{2}$|$2^{1}$|$2^{0}$|$2^{-1}$|$2^{-2}$|$2^{-3}$
:-----:|:-----:|:-----:|:-----:|:-----:|:-----:|:-----:|:-----:|:-----:|:-----:|:-----:|:-----:|:-----:|:-----:|:-----:|:-----:
@@ -95,11 +97,11 @@ $8421$码是一种有权码,第$1$、$2$、$3$、$4$位分别对应$8$、$4$
:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:
0000|0001|0010|0011|0100|0101|0110|0111|1000|1001
$8421$码就是十六进制的表达形式。如$46H=0100\,0110$,$985$用$8421$码表示就是$1001\,1000\,0101$。
$8421$码就是二进制表达十进制,只不过十进制只进行简单的对照二进制并进行一位位的拼接,与真正的二进制和十六进制不同。如十六进制的$46H=$二进制的$0100\,0110=$十进制的$38D=8421$码的$0011\,1000$,$985$用$8421$码表示就是$1001\,1000\,0101$。
使用$8421$码表示的数字进行算术运算的方式是先按照二进制的方式进行运算,若最后结果不在映射表中,即落在没有定义的$1010$到$1111$中,就直接加上$6$(因为有六位无效,所以加上六位跳过无效的位数)从而进一位,多了一段补全$0$。每个段对应的数值合在一起就是原来的结果。
使用$8421$码表示的数字进行算术运算的方式是先按照二进制的方式进行运算,若最后结果不在映射表中,即落在没有定义的$1010$到$1111$中,就直接加上$6$(因为有六位无效,所以加上六位跳过无效的位数)从而向前面一个数字段进一位加一,高位补全$0$。每个段对应的数值合在一起就是原来的结果。
如$5+8=0101+1000=1101=13$,不在映射表中,则对$1101$加$6$,即计算$19$,得到$1\,0011$这个值,补齐得到$0001\,0011$,而按照$8421$码,最高位的$0001$不再代表权值$16$,而代表十位的$1$,而后面是$3$,从而组合在一起就代表了$13$。
如$5+8=0101+1000=1101=13$,不在映射表中,则对$1101$进行二进制的加$6D=0110$,即计算$1101+0110=1\,0011$,补齐得到$0001\,0011$,而按照$8421$码,最高位的$0001$不再代表权值$16$,而代表十位的$1$,而后面是$3$,从而组合在一起就代表了$13$。
#### 余三码
@@ -147,7 +149,8 @@ $ASCII$码,数字英文符号一共$128$个字符,使用$7$位就可以表
+ 若一个计算机按字节编址,则每个地址对应$Q1B$。
+ 很多语言中将$'\backslash0'$即$00H$作为字符串结束标志。
+ 大端模式:将数据的最高有效字节存放在低地址单元中。
+ 小端模式:将数据的最高有效字节存放在高地址单元中
+ 小端模式:将数据的最高有效字节存放在高地址单元中。
+ 计算机默认是小端模式,人类常用书写方式是大端模式。
### 数据校验
@@ -156,22 +159,29 @@ $ASCII$码,数字英文符号一共$128$个字符,使用$7$位就可以表
+ 校验原理就是将更多字节映射到有限个合法状态,从而有多个冗余的非法状态,更容易判断是否非法。
+ 码字:由若干位代码组成的一个字。
+ 两个码字间的距离:将两个码字逐位进行对比,具有不同的位的个数。
+ 码距:一种编码方案可能有若干个合法码字,各合法码字间的最小距离。
+ 当码距$=1$时,无检错能力;当码距$=2$时,有检错能力;当码距$\geqslant3$时,若设计合理,可能具有检错、纠错能力。
+ 码距:一种编码方案可能有若干个合法码字,即为各任意合法码字间最少变化的二进制最小位数。(如$1000$与$1001$码距为$1$,$1111$码距为$3$)
#### 纠错理论
当码距$=1$时,无检错能力;当码距$=2$时,有检错能力;当码距$\geqslant3$时,若设计合理,可能具有检错、纠错能力。
$L-1=D+C$且$D\geqslant C$。即编码最小码距$L$越大,其检测错误的位数$D$越大,纠正错误的位数$C$也越大,且纠错能力恒小于等于检错能力。
#### 奇偶校验码
+ 奇校验码:整个校验码(有效信息位和校验位)中为$1$的个数为奇数。
+ 偶校验码:整个校验码(有效信息位和校验位)中为$1$的个数为偶数。
+ 偶位数出错时无法校验。
即通过在数据上添加一位校验位让所有数据为$1$的位的个数为奇数或偶数。
+ 奇校验:让整个校验码(有效信息位加上校验位)中为$1$的个数为奇数。
+ 偶校验:让整个校验码(有效信息位加上校验位)中为$1$的个数为偶数。
+ 偶数个位数出错时无法校验。
+ 对原始数据进行异或(模二加)运算,得到的结果即为校验位。
+ 对所有数据进行异或运算,结果为$0$表示未出错,为$1$代表出错。
+ 码距为$2$,只能检错,不能纠错。
+ 码距为$2$,只能检错,不能纠错。(为$1$的位数的个数为偶数或奇数,偶数和偶数,奇数和奇数之间最小差距为$2$,所以码距为$2$)
#### 海明码
+ 将信息分组进行偶校验,从而得到多个校验位,从而能携带多种状态信息。
+ 设信息位为$n$,校验位为$k$,从而能表达$2^k$中状态,而信息位+校验位一共$n+k$位,只错一位的状态种数加上一种正确状态为$n+k+1$,从而$2^k\geqslant n+k+1$。
+ 设信息位为$n$,校验位为$k$,从而校验位能表达$2^k$种状态,而传输总数据位数=信息位+校验位一共$n+k$位,只错一位的状态种数加上一种正确状态为$n+k+1$,从而$2^k\geqslant n+k+1$。
+ 令信息位为$D_i$,校验位为$P_j$,总海明码为$H_k$,其中校验位$P_j$必须放在海明码$H_k$位号位$2^{j-1}$的位置上,即$1$、$2$、$4$、$8$等。
+ 如果没有发生错误,则每一位进行检错都是$0$,若出现$1$,则说明出错。
+ 为了检测是一位错还是两位错,一般会加上一个全校验位,对整体进行偶校验。
@@ -188,14 +198,14 @@ k|2|3|4|5|6|7
2. $K$个信息位+$R$个校验位作为“被除数”,添加校验位后需保证除法的余数为$0$。
3. 收到数据后,进行除法检查余数是否为$0$。
+ 得到$CRC$码的方法:
1. 确定$K$和$R$以及生成多项式对应的二进制码。其中R位生成多项式的最高次幂数。
2. 将信息码左移R位,低位补$0$。
3. 使用模二除法。
1. 确定$K$和$R$以及生成多项式对应的二进制码。其中$R$位生成多项式的最高次幂数。
2. 将信息码左移$R$位,低位补$0$。
3. 使用模二除法。(即相减时是异或运算,不能向上进位或借位;除法取余数时也不比较除数与被除数除第一位以外的低位大小,只需要相同的位数,这是由于异或加减法不进行进借位的特征)
4. 余数就是校验位,只比多项式少一位。
5. 对全部数据进行多项式除,余数为$0$代表无措。
5. 对全部数据进行多项式除,余数为$0$代表无错。
6. 若余数不为$0$,则出错。
7. 若$n$个信息位,$k$个校验位,若生成多项式得当,且$2^k\geqslant n+k+1$,则$CRC$码可纠正一位错。实际上基本上不怎么用来纠错。
+ 检错:将收到的$CRC$码用生成多项式$G(x)$做模二出发,若除数为$0$则码字无误,若只有一位为$1$,则该位出错,更多位则无法检错。即只具有一位的检错纠错能力。
+ 检错:将收到的$CRC$码用生成多项式$G(x)$做模二除法,若除数为$0$则码字无误,若只有一位为$1$,则该位出错,直接取反,更多位则无法检错。即只具有一位的检错纠错能力。
## 定点数
@@ -208,11 +218,13 @@ k|2|3|4|5|6|7
+ 整个机器字长的全部二进制位均为数值位,没有符号位,相当于数的绝对值。
+ $n$位无符号数表示范围为$[0,2^n-1]$。
+ 无符号数不涉及小数。
+ 无符号数只有原码的概念,没有反码、补码、移码。
#### 有符号数
+ 假设机器字长$n+1$位,符号位$1$位,有效数字位$n$位。
+ 定点整数:最高一位是符号位,$0$是正,$1$是负,小数点位置一般隐含在最后。范围为$[-(2^n-1),2^n-1]$。
+ 定点小数:最高一位是符号位,$0$是正,$1$是负,小数点位置隐含在符号位后面。范围为$[-(1-2^{-n}),1-2^{-n}]$。
+ 定点小数:最高一位是符号位,$0$是正,$1$是负,小数点位置隐含在符号位后面,是纯小数。范围为$[-(1-2^{-n}),-2^{-n}]\cup[2^{-n},1-2^{-n}]$。
+ 数值部分也称为尾数。要保存一个非整数需要保存定点整数与定点小数两个部分。
#### 原码
@@ -222,17 +234,22 @@ k|2|3|4|5|6|7
+ 若使用$1B$来保存数值,则$+19D$就是$0001\,0011$,$-19D$就是$1001\,0011$。
+ 有时$1001\,0011$会写为$1,0010011$,其中的逗号只是为了标注正负号,本身是不存在的。
+ 若未指明机器字长,则最开头的多个$0$可以省略。如$1001\,0011$可以表示为$1,10011$。
+ 同理小数也可以使用$1.11$表示,这是指$-0.11$而不是$1.11$的真值。
+ 同理小数也可以使用$1.11$表示,这是指$-0.11$而不是真值$1.11$。
+ 若机器字长$n+1$位,则原码整数的表示范围是$[-(2^n-1),2^n-1]$。
+ 若机器字长$n+1$位,则原码小数的表示范围是$[-(1-2^{-n}),1-2^{-n}]$。
+ 原码表示时真值$0$有$+0$和$-0$两种形式。
+ 若机器字长$n+1$位,则原码小数的表示范围是$[-(1-2^{-n}),-2^{-n}]\cup[2^{-n},1-2^{-n}]$。
+ 原码表示时真值$0$有$+0$和$-0$两种形式,因为符号位对$0$没有影响,所以造成了一定的空间浪费和错乱。
<!-- 对于纯整数:当$x\in[0,2^n)$,$[x]_{\text{原}}=0,x$,当$x(-2^n,0]$,$[x]_{\text{原}}=2^n-x=2^n+\vert x\vert$。
对于纯小数:当$x\in[0,1)$,$[x]_{\text{原}}=x$,当$x(-1,0]$,$[x]_{\text{原}}=1-x=1+\vert x\vert$。 -->
#### 反码
+ 反码:若符号位为$0$,则反码与原码相同,若符号位为$1$,则数值位全部取反。
+ 可以转换为原码再取反。
+ 若机器字长$n+1$位,则反码整数的表示范围是$[-(2^n-1),2^n-1]$。
+ 若机器字长$n+1$位,则反码小数的表示范围是$[-(1-2^{-n}),1-2^{-n}]$。
+ 若机器字长$n+1$位,则反码小数的表示范围是$[-(1-2^{-n}),-2^{-n}]\cup[2^{-n},1-2^{-n}]$。
+ 范围表示没有变化。
+ 反码表示时真值$0$有$+0$和$-0$两种形式。
+ 反码只是由原码转换为补码的一个中间态,实际上并没有作用。
@@ -240,22 +257,23 @@ k|2|3|4|5|6|7
+ 补码:若符号位为$0$,则反码与原码相同,若符号位为$1$,则数值位全部取反再加一,即反码加一。
+ 补码表示时真值$0$只有一种形式$0000\,0000$。
+ 多出来的一种形式$1000\,0000$表示$-2^7$和$-1$。
+ 若机器字长$n+1$位,则补码整数的表示范围是$[-2^n,2^n-1]$。
+ 若机器字长$n+1$位,则补码小数的表示范围是$[-1,1-2^{-n}]$。
+ 将负数补码转回原码的方法相同:尾数取反,末位加一。补码的补码就是原码。
+ 如果已知一个数值的补码,那么求这个值的负数的补码就是全部包括位取反,末位加一。
+ 如果已知一个负数的补码,那个求这个值的原码就是数值位取反再加一,或是负数补码中,最右边的$1$以及右边不变,最右边的$1$的左边取反。
+ 多出来的一种形式$1000\,0000$表示正数的$-2^7$和小数的$-1$。
+ 若机器字长$n+1$位,则补码整数的表示范围是$[-2^n,2^n-1]$。(比原码多个$-128$)
+ 若机器字长$n+1$位,则补码小数的表示范围是$[-1,1-2^{-n}]$。(比原码多个$-1$)
+ 负数补码转回原码:尾数取反,末位加一;或是负数补码中,最右边的$1$以及右边不变,最右边的$1$的左边取反。
+ 数值的补码求其负数的补码:全部位包括符号位取反,末位加一。
+ 对一个整数的补码再求补码,等于该整数自身。
+ 补码算术移位:将补码的符号位与数值位一起右移一位并保持原符号位的值不变,表示除二。
+ 变形补码:又称为模四补码,双符号位的补码小数,用$00$表示正,$11$表示负,用于完成算术运算的$ALU$部件中。
+ 变形补码:又称为模四补码,即双符号位的补码小数,用$00$表示正,$11$表示负,用于完成算术运算的$ALU$部件中。
#### 移码
+ 补码的基础上将符号位取反。即在真值上加上一个常数,一般为$2^n$。
+ 一般是在补码的基础上只将符号位取反,即在真值上加上一个常数偏移量$2^n$。也可能加上不同的偏移量。
+ 移码只能用于表示整数,而不能表示定点小数。一般用来表示浮点数的阶码。
+ 若机器字长$n+1$位,则移码整数的表示范围是$[-2^n,2^n-1]$。
+ 若机器字长$n+1$位,则移码小数的表示范围是$[-1,1-2^{-n}]$。
+ 移码由于负数的最高位为$0$,正数的最高位为$1$,从而能更方便对比大小。
+ 只有一个零的表示$10\cdots0$。
+ 移码由于负数的最高位为$0$,正数的最高位为$1$,所以保证了原数据大小顺序,从而能更方便对比大小。
机器数|无符号数|原码|反码|补码|移码
:----:|:------:|:--:|:--:|:--:|:--:
@@ -280,7 +298,7 @@ k|2|3|4|5|6|7
+ 带余除法:设$x,m\in Z$,$m>0$则存在唯一决定的整数$q$和$r$,使得$x=q\cdot m+r\,,0\leqslant r<m$。
+ 若两个数绝对值之和为模,则互为补数。即模-数的绝对值=数的补数(正数)。从而数加上数的补数就得到了模。
+ 补码就是正数不变,负数取模的结果。如$-66=-0100\,0010$,而$(1000\,0000-0100\,0010)\mod(1111\,1111)=1011\,1110$,也就是其补码。
+ 从而就可以用补数的加法替代原码转换的减法。
+ 从而就可以用补数的加法(被减数转为其负数的补码)替代原码转换的加减法。
+ 所以补码可以让减法操作转换为加法操作,减少硬件成本。
### 定点数运算
@@ -290,7 +308,7 @@ k|2|3|4|5|6|7
+ 算术移位:通过改变各个数码位和小数点的相对位置,从而改变各数码位的位权。可用移位运算实现乘法、除法。
+ 原码的算数移位——符号位保持不变,仅对数值位进行移位:
+ 若右移高位补$0$,低位舍弃,右移代表除$2$,若移出的是$0$则刚好整除,若移出的是$1$则会整除余$1$丢失精度。
+ 若左移低位补$0$,高位舍弃,左移代表乘$2$,若移出的是$0$则刚好乘$2$,若移出的是$1$,则会严重误差。
+ 若左移低位补$0$,高位舍弃,左移代表乘$2$,若移出的是$0$则刚好乘$2$,若移出的是$1$,则会溢出严重误差。
+ 反码的算术移位——正数的反码与原码相同,所以正数的处理跟原码一样。而对于负数而言,反码的$1$等于原码的$0$,反码的$0$等于原码的$1$:
+ 若右移低位补$1$,高位舍弃。
+ 若左移高位补$1$,低位舍弃。
@@ -298,7 +316,7 @@ k|2|3|4|5|6|7
+ 负数补码中,最右边的$1$及其右边同原码一样。最右边的$1$的左边同反码一样。
+ 右移同反码,高位补$1$,低位舍弃。
+ 左移同原码,低位补$0$,高位舍弃。
+ 逻辑移位,可以视为对无符号数的算术移位:
+ 逻辑移位,逻辑的移位可以视为对无符号数的算术移位:
+ 逻辑右移:高位补$0$,低位舍弃。
+ 逻辑左移:低位补$0$,高位舍弃。
+ 循环移位,将移出的一位放到另一端的端点,类似队列:
@@ -323,31 +341,34 @@ k|2|3|4|5|6|7
+ 负-正→负+负。
+ 正-正→正+负。
+ 负-负→负+正。
+ 补码的加减,由于减法器的硬件实现比较困难,所以原码的减法操作可以由补码来更简单实现,不用考虑符号位的异常,直接全部参与运算:
+ 补码的加减,由于减法器的硬件实现比较困难,所以原码的减法操作可以由补码来更简单实现,不用考虑符号位的问题,直接全部参与运算:
+ 参与运算的两个操作数均用补码表示。
+ 按二进制运算规则运算,逢二进一。符
+ 号位与数值位按同样规则一起参与运算,符号位运算产生的进位要丢掉,结果的符号位由运算得出。
+ 按二进制运算规则运算,逢二进一(与模二加减法不同需要进位)。
+ 符号位与数值位按同样规则一起参与运算,符号位运算产生的进位要丢掉,结果的符号位由运算得出。
+ 补码加减运算依据下面的公式进行。当参加运算的数是定点小数时,模$M=2$;当参加运算的数是定点整数时,模$M=2^{n+1}$。$[A+B]_\text{补}=[A]_\text{补}+[B]_\text{补}$($\mod M$);$[A-B]_\text{补}=[A]_\text{补}+[-B]_\text{补}$($\mod M$)。
+ $\mod M$运算是为了将溢出位丢掉。也就是说,若做加法,则两数的补码直接相加;若做减法,则将被减数与减数的机器负数相加。
+ 补码运算的结果亦为补码。
+ 溢出判断,由于使用补码进行加减操作都会变成加法,所以只用考虑加法溢出的处理。
+ 小于最小值就是下溢。只有负数+负数才会下溢得到正数。如$-24-124=1110\,1000+1000\,0100=0110\,1100=108$。
+ 大于最大值就是上溢。只有正数+正数才会上溢得到负数。如$15+124=0000\,1111+0111\,1100=1000\,1011=-117$。
+ 对于小数,其绝对值小于等于$1$。
+ 方法一,采用一位符号位(模二补码),根据符号位判断:
+ 设$A$的符号为$A_s$,$B$的符号为$B_s$,运算结果的符号为$S_s$。
+ 则溢出逻辑表达式为$V=A_sB_s\overline{S_s}+ \overline{A_s}\overline{B_s}S_s$(即$V=A_s\&\&B_s\&\&!(S_s)\mid\mid!(A_s)\&\&!(B_s)\&\&S_s$)。
+ 则溢出逻辑表达式为$V=A_sB_s\overline{S_s}+ \overline{A_s}\overline{B_s}S_s$(即$V=A_s\&\&B_s\&\&!(S_s)\mid\mid!(A_s)\&\&!(B_s)\&\&S_s$,前面判断下+溢,后面判断上溢)。
+ 若$V=0$,表示无溢出,若$V=1$,表示有溢出。
+ 由于只有操作数同号才能溢出,即判断标准为,两个操作数是否同号,结果符号是否与原操作数相同,这两个条件必须同时满足。
+ 如$-24-124=108$产生了溢出,$A_s=1$、$B_s=1$、$S_s=0$,$V=A_sB_s\overline{S_s}+ \overline{A_s}\overline{B_s}S_s=1\,1\,1+0\,0\,0=1+0=1$,所以产生了溢出。
+ 方法二,采用一位符号位(模二补码),根据数据位进位$1$情况判断:
+ 符号位的进位$C_s=0$,最高数值位的进位$C_1=1$时产生了上溢。
+ 符号位的进位$C_s=1$,最高数值位的进位$C_1=0$时产生了下溢。
+ 原理同方法一类似,如果进位产生并符号与期待符号不同则发生溢出。
+ 如$-24-124=1110\,1000+1000\,0100=0110\,1100$中符号位都为$1$相加结果为$0$,所以符号位进位,$C_s=1$,而最高数值位为$1+0=1$,没有进位,所以$C_1=0$,所以就产生了下溢。
+ 方法三,采用双符号位(模四补码),正数符号为$00$,负数符号为$11$。
+ 若两个符号位不同,则表示溢出,第一个符号位表示应该得到的符号位,第二个符号位代表实际得到的符号位。
+ 如$-24-124=11,110\,1000+11,000\,0100=10,110\,1100=108$。下溢。
+ 如$15+124=00,000\,1111+00,111\,1100=01,000\,1011=-117$。上溢。
+ 实际存储时只存储一个符号位,运算时会复制一个符号位。
+ 符号扩展:防止溢出的一个方法就是将短数据扩展为长数据。(补码高$1$低$0$)
+ 符号扩展:防止溢出的一个方法就是将短数据扩展为长数据,把数据全部拓展为等长。(正数补码全部补$0$,负数补码高位补$1$低位补$0$)
+ 整数扩展,在原符号位和数值位中间添加新位,正数都填充$0$,对于负数:
+ 原码:扩展补$0$。
+ 反码:扩展补$1$。
@@ -359,9 +380,49 @@ k|2|3|4|5|6|7
#### 定点数乘法运算
对于原码的乘数运算可以参考十进制的乘数运算,将乘数一位一位的乘被乘数然后再全部错位相加得到的就是答案。而使用二进制的一位位乘法显然比十进制的一位位乘更简单。
对于原码的乘数运算可以参考十进制的乘数运算,将乘数一位一位的乘被乘数然后再全部错位相加得到的就是答案。
+ 原码一位乘法:
```txt
318
× 211
-------
318
318
636
-------
67098
```
为什么要错位?因为乘数每一位的数值的位权不同,为基数的幂,所以本质应该是:
```txt
318
×(200+10+1)
-----------
318
3180
63600
-----------
67098
```
而使用二进制的一位位乘法显然比十进制的一位位乘更简单:
```txt
1101
× 1011
--------
1101
1101
0000
1101
--------
10001111
```
所以此时分析笔算二进制乘法就被拆解出了二进制乘法流程:将乘法变为加法和移位运算,将乘数一位位的向前移动并与被乘数相乘,由于是二进制所以只有$0$和$1$,遇到乘数当前位值为$1$就在原来的和上加上被乘数,并向前移动一位,如果是$0$就加上$0$继续移动一位,当乘数位数访问完成则乘法完成,所有的和相加称为最后的积。
原码一位乘法:
+ 一般使用原码一位乘法,即每次只乘一位的数据。
+ 在原码乘法时,可以先符号位单独处理,将两个符号进行异或操作,得到的结果就是最后的结果的符号。然后对数据的绝对值(去除符号位)进行一位位的乘法(位积)然后相加。
@@ -376,7 +437,7 @@ k|2|3|4|5|6|7
6. 将两个符号位的异或结果赋值给积最高位。
+ 原码一位乘法逻辑运算:
1. 初始化,左边为部分积,即计算的部分结果,最开始为全$0$,右边为乘数的绝对值,最后边全部为丢失位。
2. 根据丢失位前一位的值来判断加上什么,若是$1$则加上被乘数的绝对值,若是$0$则加与被乘数等长的全$0$。
2. 根据丢失位前一位的值来判断加上什么,若是$1$则加上被乘数的绝对值,若是$0$则加上被乘数等长的全$0$。
3. 右移部分积一位,高位补$0$,丢失位多一位。
4. 继续计算,直到乘数全部被移出。字长为$n+1$位则需要移位计算$n$次。丢失位前的就是全部部分积。
5. 将两个符号位的异或结果赋值给积最高位。