前言: 这篇文章主要对细碎的和一些重要的知识点进行总结
目录
第一章
1.4 程序开发与执行过程
高级语言到机器码以及各个器件的工作过程(P5 19:00)
不同高级语言到机器码的过程: C++/C都是编译型语言,将所有代码先编译为汇编语言,再生成机器码,java也是编译型语言;
而python则一句一句得将代码解释为机器码,是解释型语言
第二章 数据的机器级表示
补码
- 将 真值 x转化为补码: 例如x为 -1001,将其转化为补码, 真值全部取反,然后+1,首位补1(代表负值) 1 (这种方法的本质其实是模2法,相当于取反+1) ,结果为 1 0111
- 将 原码 转化为补码(常用于浮点数尾数的求差运算 ): 例如 0 111,转化为 0 111 (正数原码的补码等于其本身),又如 1 001(真值为-1), 符号位不变,其余的数全部取反,然后+1 ,结果为 1 111 .(原码加减法)
浮点数
- 阶数 用移码表示,移码 = 真值 + 偏置值
- 尾数 用原码表示,运算见教材1P38
- 浮点数的 表示范围 : 对于单精度来说,阶码有8位,最大对应127,令尾数全为1,为 (1.1111…1)2×2127 , ,阶码最小为-126(-127对应全0,-128对应全1),令尾数全为0,为 (1.0000…0)2×2-126 ,大致对应 10-38 -1038 ; 双精度阶码有11位,类似.
- 浮点数的三种状态: 1.规格数: 用于表示最常见的数值, 比如1.2, 34567, 7.996, 0.2. 但规格数不能表示0和非常靠近0的数; 2.非规格数: 用于表示0, 以及非常靠近0的数, 比如1E-38; 3. 特殊数: 用于表示"无穷"和"NaN"; 具体请参照浮点数的三种状态或者教材1P37.
BCD码
BCD码是用特定的四位二进制数表示0-9的十进制数,这些二进制数没有权重
对于8421码来说,当表示9+2这样的加法运算时,由于11(1011)在8421码中没有对应的四位二进制数表示,所以要加上一个0110(十进制为6)强制将结果由4位溢出成5位,变成10001(高位补零0001 0001),而0001在8421中对应十进制1,故结果为11.相当于8421码要逢1010进0110
可以这样理解,9+2=11对应的十进制数已经进位了,相应的四位二进制也必须进位,而+6则是强制让四位二进制数大于1111溢出0001,11+6相当于16+1
补码,原码,反码表示范围
第三章 原码,补码的加减乘除\
计算二进制的加减乘除和十进制没有本质区别,重要的是我们要
学习这些运算如何在计算机内部执行的
,比如我们可以很轻松的计算无符号整数1111-0011,但计算机大部分没有专门为减法设计的电路,所以我们将 -0011 转化为 +[-0011]补 即 +1101,才得以在计算机内部执行.
加减都在ALU内,进位和溢出的情况参照教材书2P61
无符号整数加减法(用于原码的数值部分在加法器内运算)
- 当求 x-y 时, 转化为加法运算,将 -y 转化为 +[-y]补 .如 y=101, 将数全部取反加1,即 011 , 但是
无符号整数只能用在运算不出现负数的情况下
.
补码加减法(用于带符号整数的运算)
- 当求 [x-y]补 (x和y为真值)时,因为-y在计算机内必须转化为补码运算,所以结果一定是补码表示, 可以转化为 [x]补 + [-y]补 ,若已知[y]补=1 0011, 计算[-y]补, 将[y]补从右往左出现的第一个1左边的全部取反包括符号位(即全部取反+1) ,得到 0 1101.
- 当求 X-Y (X和Y都是补码)时: 转化为 X+[-Y]补 ,转化规则同上.
- 补码进位规则为 OF=Cn-1 异或 Cn 2,结果的符号为F的最高位,产生进位后结果为n+1位,无进位结果为n位, 结果都是补码表示.
原码加减法(用于浮点数尾数部分的运算)
- 数值运算部分由ALU处理,符号位由其它的辅助电路处理
原码加减法的规则似乎很奇怪,我们可以想象时钟,
用mod12的十进制加减法来类比
mod2n的二进制无符号整数加减法
从这两个例子中我们发现了一个奇怪的问题,为什么 无符号整数的减法最高位有进位结果为正,而无进位结果为负?
- 我们从补码的定义出发,例1中, (-2)补为 (-2+12)mod12=10, 那么(3+10)mod12可以写成 (3-2+12)mod12 ,括号中的结果为13>12,而我们在计算前执行了+12操作,这说明原来的计算(3-2)结果是大于0的,而在 mod12 的计算中 (13)mod12=1,产生了进位,所以说 最高位产生进位则运算结果为正 ,加法器的作用只是将减法变成了加法;
- 在例2中,(-8)补=(-8+12)mod12=4,那么 (3+4)mod12可以写成 (3-8+12)mod12,括号中的结果为7<12,而我们在计算前执行了+12操作,所以原先的计算值(3-8)是小于12的,又(7)mod12=7没产生进位,所以说 最高位没产生进位则运算结果为负数
总结
:手工计算减法时,我们将结果与 0 比较判断正负,而在加法器做减法时,由于减数取补码加上了 12,所以我们将结果与 12 对比判断正负,而结果大于 12 的情况下要产生进位,所以进位对应的计算结果为正数,相反,不进位表明计算结果为负数
可以根据这一逻辑类比无符号整数的二进制减法
可以总结到,做减法时都是把 减数取反+1 ,这些操作逻辑由加法器的sub和多路选择器来实现
第七章 存储器层次结构
cache 的一些考题
-
性能分析
-
局部性原理 按块与内存进行数据交换
-
cache替换