工作原理:
-
存储程序:将程序存放在计算机的存储器中
-
程序控制:按指令地址访问存储器并取出指令,经译码依次产生指令执行所需的控制信号,实现计算的控制,完成指令功能
计算机组成
硬件
主机部分:运算器(CPU)+控制器(CPU)+内存储器(内存)。
-
运算器:算术运算(+、-、*、\);逻辑运算(与、或、非、移位、异或等);基本结构(寄存器、连接通路)
-
控制器:控制程序和数据的输入、运行处理运算结果
-
存储器:用于储存数据、运算中间结果,容量为1K = 10条地址线,1M=1024k=20条地址线就是2^10幂
外设部分:I/O输入设备(键盘、鼠标、网卡)、I/O输出设备(打印机、显示器)、外存储器(U盘)
主线部分:地址线、数据线、控制线
软件
系统软件:操作系统、网络系统、编译系统
主频(f)
指CPU内核工作的时钟频率,CPU内数字脉冲信号震荡的速率
时钟周期(T)
节拍周期,计算机中最基本的、最小的时间单位,f越高,T越小
CPI(Clock cycles Per Instruction)
执行一条指令需要的时钟周期数(即时钟周期的个数)计算公式: C P I = 程 序 中 所 有 的 指 令 时 钟 周 期 之 和 程 序 指 令 总 数 CPI = \frac{程序中所有的指令时钟周期之和}{程序指令总数} CPI=程序指令总数程序中所有的指令时钟周期之和
与之相反的是IPC:每个时钟周期执行的指令条数
MIPS(Million Instructions Per Scond)
每秒钟执行的指令条数(单位:百万条/秒)公式如下: M I P S = 指 令 条 数 执 行 时 间 ∗ 1 0 6 = 指 令 条 数 ( 程 序 中 所 有 的 指 令 时 钟 周 期 之 和 / f ) ∗ 1 0 6 = 指 令 条 数 ∗ f 程 序 中 所 有 的 指 令 时 钟 周 期 之 和 ∗ 1 0 6 = f C P I ∗ 1 0 6 MIPS = \frac{指令条数}{执行时间*10^6} = \frac{指令条数}{(程序中所有的指令时钟周期之和/f)*10^6} = \frac{指令条数*f}{程序中所有的指令时钟周期之和*10^6} = \frac{f}{CPI*10^6} MIPS=执行时间∗106指令条数=(程序中所有的指令时钟周期之和/f)∗106指令条数=程序中所有的指令时钟周期之和∗106指令条数∗f=CPI∗106f
机器数
小数二进制转换
求 5 16 \frac{5}{16} 165的二进制数。 5 16 \frac{5}{16} 165 = 1 16 \frac{1}{16} 161 + 1 4 \frac{1}{4} 41 = 0.0101
快捷方法:首先将分母转换为2的次方数,这里是16所以不需要转换,求出5的二进制数为0101,因为是小数所以左移(变小)24大小,那么就是左移4位,结果就是0.0101
模运算:
数学定义公式:x mod y = x - y ⌊ x / y⌋
即x模y = x - (y * x与y的商的下界)
//最简单的模运算比如说10 mod 3 那么就是10/3取余,则10 mod 3 = 1。
题目1:以时钟为例子当前时间5点想要调至到12点
答:
方法一:减去5个点则表示-5
方法二:加上7个点则表示7
那么此时负数取模则表示为 -5 mod 12 = 7 ,当然7 mod 12 != -5因为正数取模就是取余运算7<12那么取余就是本身7 mod 12 = 7
题目2:在32位程序中-5的取模公式是?
答:根据题目条件得出公式:-5 % pow(2,32)
题目3:-3 mod 2结果为?
答:
//负数取模
-3 mod 2
= -3 - (2 * ⌊ -3/2 ⌋)
= -3 - (2 * ⌊ -1.5 ⌋) //这里是取-3与2的商的向下取整
= -3 - (2 * -2)
= -3 + 4
= 1
//正数取模
10 mod 3
= 10 - 3 * ⌊ 10/3 ⌋
= 10 - 3 * 3
= 1
反码计算:
问题:已知:x=1101 , y=-1010 用反码运算求 x+y
答:
x[反] = 01101 y[反]= 10101
x[反]+y[反]=1000010 //此时结果明显不对需要再将溢出进位拿出去并去掉进行相加
x[反]+y[反] = 000010 + 1 = 000011
补码计算:
//模:补码中符号位进位后所在位的权值
问题:-1用补码表示,下列哪个是正确的?
A.11 B.111 C.1111 D.11111 E.111111
答:因为题目没有规定字长场景那么答案是ABCDE
问题:整数x补码形式为X0X1X2X3X4X5,此时的-1补码是?模是?
答:根据形式格式判断可知字长格式为6位,那么-1[补]=111111,模为2^6
问题:字长为32位的机器采用补码数据表示时其模为?
答:2^32
移码计算:
定义:将补码的符号位取反
原理:该数加上一个偏移。机器字长为n时,偏移量为2^(n-1),X为正整数时即X[移] = 2^(n-1) + X
真值:1101100
01101100[原] = 01101100[反] = 01101100[补] = 11101100[移]
真值:-1101100
11101100[原] = 10010011[反] = 10010100[补] = 00010100[移]
定点与浮点数据
定点
定义:可表示小数、整数
表现形式:X0.X1X2X3…Xn(定点小数)、X0X1X2X3…Xn.(定点整数)
不足:数据表示的范围有限
定点小数:如x=0.1011、y=-0.1011 则对应的机器码为x[原] = 0.1011 y[原]=1.1011 其中小数点前的0被忽略了
浮点
当数的范围超出了定点数能表示的访问则使用浮点数
定义:把数的范围和精度分别表示的一种数据表示方法;例如:ESE1E2…EnM1MsM2…Mn (E表示阶码位数,数据的范围。M表示尾数位数,决定数的精度) ⟶ \longrightarrow ⟶ N = m * 2e ,例如11100.101b,向左移5位变成规格化的0.11100101然后再移回来规格化后的浮点数就是0.11100101 * 2 101(101表示5的二进制)
IEEE 754格式数据:
单精度:1符号位+ 8位偏指数+23位尾数(比如C中的float占4字节)
双精度:1符号位+11位偏移数+52位尾数(比如C中的double占8字节)
IEEE 754转换公式:(-1)s * 2e * 1.M
IEEE 754浮点格式中的阶码部分采用的是移码,所谓移码就是增加一个增量进行位移得到的数叫价移,那么单精度这个位移值就是2^7 -1 (127),双精度就是2^10 -1 (1023),是通过它们的偏指数位数得来的。 这样做的原因是为了将浮点数的阶码值变成非负整数,便于浮点数的比较和排序
IEEE 754尾数形式为1.XXXXXXX,其中浮点数中的M部分保存的是XXXXXX(1被省略了)从而可以保留更多的有效位
例题:
问题1:设浮点数字长16位,其中阶码5位,尾数11位,求-58(十)的二进制定点数和浮点数并分别它的定点机、浮点机的机器数形式。
答:
-58 d = '-111010'b
定点数:补齐长度为尾数位长度;-0000 1110 10,这里加符号刚好11位
浮点数:对齐格式为因为-58是一个整数所以浮点数的格式为0.xxxxx这里就是-0.111010,我们将小数点左移了6位,那么就要补回来再乘以2^6次方用科学计数法表示就是2^110,最后结果就是 -0.111010 * 2^110(规格化,不能计算成2的110次方)
定点数机器码:x[原] = 1,00011 1010 x[反] = 1,11100 0101 x[补] = 1,11100 0110
浮点数机器码: 阶数 x[原] = 0,0110 , 尾数 x[原] = 1,1110 1000 00 ,x[阶移,尾数] = 阶数+移码(补码符号位取反)+尾数(要转换成补码) = 1,0110;1 0001 1000 00
问题2:用IEEE 754格式中表示-58(十)的浮点数形式。
答:
在32位中:尾数部分转换为1.XXXX形式,那么就是1.11010左移了5位,那么阶数就是00000101(5的原码),再将阶数转换为阶移,那么就是x[阶原] = 00000101 ----> x[阶原]+float偏移值(32位) ----> x[阶原] + 2^7 -1 ----> x[偏移]10000100 (备注!计算偏移快捷方法就是先将它原码变为移码然后减去1)
尾数:x[尾] = 11010 0000 0000 0000...00(共23位)
那么32位的浮点数形式为:1 10000100 11010000000000000000000(共32位,格式:符号位+偏移数+尾数)
在64位中:尾数:11010000....(共52位) 偏移数:10000000100(共11位)
那么64位的浮点数形式位:1 100000000100 11010000....(共64位)
问题3:用IEEE 754格式中表示20.59375(十)的浮点数形式。
答:
x[真] = 20.59375 = pow(2,4) + pow(2,2) + pow(2,-1) + pow(2,-4) + pow(2,-5)
x[原] = 0,10100.10011
x[尾数] = 1.010010011(左移了4位)
x[偏移] = pow(2,4)+pow(2,7)-1 = 00000100 + 127 -1 = 10000011
最终格式:0 10000011 01001001100000000000000(格式:符号+偏移数+尾数)
十六进制:0x41a4c000
码距的计算
码距:用于检测编码是否错误
将两个位串进行异或(xor)再计算异或运算结果中的1的个数,例如:110 xor 011 = 101 那么码距就是2
定点数运算及溢出检测
整数 :先转换为补码运算再模最高符号位的进位所在的权值,那么就是2n+1 (n表示除符号位的位数)
小数:先转换为补码运算再模2 0+1 (因为是小数所以最高符号位进位的权值就是20+1)
如下列:
//补数的相反数
问题:分别求出y[补] = 10011和y[补]= 11, 的-y[补]
答:
y[补]= 10011 = y[原] = 11101 ;-y[原] = 01101 ; -y[补] = 01101
y[补]= 00011 = y[原] = 00011 ;-y[原] = 10011; -y[补] = 11101
结论:根据一个补数求该相反数的补数,将所有位取反再加一
//整数运算
问题:x=10101 y=10010 求x-y
答:
x[补] = 0,10101; y[补] = 0,10010
x-y = x+(-y) = x[补] + (-y[补]) mod 2^(n+1)
= (0,10101 + 1,01110 ) mod 2^(5+1)
= 10,00011 mod 2^(5+1)
= 10,00011 mod 10,00000
= 0,00011 //正常程序执行公式 //也可通过将结果进行反码转换原码得到
= 11
//负数小数运算
问题:x=-0.1011,y=-0.0110 , 求x-y
答:
x[补] = 1.0101 ; y[补] = 1.1010
x-y = x+(-y) = x[补] + (-y[补]) mod 2^(n+1)
= (1.0101 + 0.0110) mod 2^(0+1)
方式一: 1.1011 mod 2 //mod 2^(n+1) 等价于 反码转换原码 因为这里是小数所以n为0 那么就是mod 2^1
方式二:反码:1.1011 -> 原码:1.0101 -> 真值 : -0.0101 -> 十进制:-0.3125
溢出
溢出例题:
问题1: x=+10010 y=+10101 求x+y
x+y[补] = 100111
x+y = 100111 mod 2^(6+1)
x+y = 100111 mod 1000000
x+y = 100111
x+y = -11001(同号相加符号位发生改变,溢出!)
问题2:x=-10010 y=-10101 求x+y
x+y[补] = 1,01110 + 1,01011 = 10,10001
x+y = x+y[补] = 10,10001 mod 2^(5+1) = 0,10001
x+y = +10001(溢出!!!)
由上例可得出溢出只会在同号运算时发生。
进位异或判断溢出:
在同号运算且补码的状态下,最高数据位进位 xor 符号位产生的进位 结果为1则溢出
如上面问题1中溢出表达式为:(1+1) xor (0+0) --> 1 xor 0 --> 1 溢出
如上面问题2中溢出表达式为:(0+0) xor (1+1) --> 0 xor 1 --> 1 溢出
双符号位判断溢出:
问题:x=0.1101 y=-0.0111 ,用补码求x+y , x-y
答:
x[补] = 0.1101 , y[补] = 1.1001 , -y[补] = 0.0111
x+y = (x[补] + y[补]) mod 2^(4+1) = 10.0110 mod 2^(4+1) = 0.011 = 0.375
x-y = (x[补] + (-y)[补]) mod 2^(4+1) = 01.0100 mod 2^(4+1) = 1.01 = -0.25 (显然结果是错误的)
上述的例子中x+y是异号运算那么使用进位异或的方法就不行了,可以看到这里的最高数据位有进位,那么这时
符号位就有了两位,这时就叫做双符号位 (注意!!! 转换为双符号位时变形补码后取模就是取 2n+2)。
正溢出:当该位数存储最大值时,再给它加上1那么就会将符号位0变为1,此时就是溢出了(如(215-1)+1 )
215如下:
0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
---|
215+1后的结果
1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
---|
负溢出:最该位数存储最小负值时(不是最小值),再减去1那么就会将符号位1变为0,如下所示:
1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
---|
-1后的结果
0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
---|
双符号位时,00表示正号,11表示负号,01表示上(正)溢出,10表示下(负)溢出。
那么采用双符号位判断上述的问题如下:
问题:x=0.1101 y=-0.0111 ,用补码求x+y , x-y (用双符号位表示)
答:
x[补] = 00.1101 , y[补] = 11.1001 , -y[补] = 00.0111 //00正号 11负号
x+y = 100.0110 mod 2^(4+2) = 00.0110 //这里00表示正数,无溢出
x-y = 01.0100 mod 2^(4+2) = 01.0100 //01表示上溢出
逻辑、算术移位
逻辑左移:数据整体左移一位,最高位D15被移除至DF最低位补0,示例:01101110 ----移位--> 11011100
算术左移:数据整体左移一位,最高位D15被移除至DF最低位补0,和逻辑移位的区别是算术理解为乘2,示例:01101110 ----移位--> 11011100
逻辑右移:数据整体右移一位,最高位D1被移除最高位D15处补0,示例: 11101110 ----移位--> 01110111
算术右移:数据整体右移一位,最高位D15被复制至右移的后D15处,最低位D1移除,和逻辑移位的区别是D15处不是补0而是复制原来的D15位,示例:11101110 ----移位--> 11110111
浮点数运算
做浮点运算时阶码和尾数用补码、双符号位表示以便于判断溢出
运算步骤:
- 将小阶向大阶对齐。移动
运算公式:设 x = 2Ex * Mx ,y = 2Ey * My 。则 x + y = (2Ex-Ey * Mx + My ) * 2Ey