3.加法器电路
3.1.无符号数加法
①加法器的左端输入被加数A(1010),右端输入加数B(1000)
②加法 → Sub = 0,即加减法控制信号向多路选择输入0,B通过MUX的0侧输入到加法器中
③加法器进行对1010和1000进行逐位相加 → 1 0010 → 只保留低4bit,最高位丢弃
④OF(虽然对无符号数没有意义,但是仍然会生成):1010的最高位(1)和1000的最高位(1)进位(1)和1010的次高位(0)和1000的次高位(0)进位(0)进行异或 → OF = 1
⑤CF(无符号数通过CF是否为1判断是否产生溢出):最高位进位(即cout输出位,1)和sub输入位(加法,0)进行异或 → CF = 1,1010 + 1000发生进位/借位,即溢出
3.2.无符号数减法
①加法器的左端输入被加数A(1010),右端输入加数B(1000)
②减法 → Sub = 1
1.加减法控制信号向多路选择输入1,B通过MUX的1侧输入到加法器中:B经过非门,即B按位取反 → 0111(实现按位取反)
2.加法器进行对1010和0111进行逐位相加 → 1 0001
3.加减法控制信号通过cin向加法器输入1 → 1 0010(实现末位加1)只保留低4bit,最高位丢弃
③CF(无符号整数的减法中,减数大于被减数,就会发生借位,即结果为负数,而无符号数只能表示整数,故CF = 1时表示无符号减法溢出):最高位输出位(1)和sub输入位(减法,1)进行异或 → CF = 0,1010 - 1000没有借位/进位,即没有溢出
3.3.补码加法/减法
①实现原理和无符号数的加/减原理一样(ALU在实现运算时,并不区分是实现的原码还是补码的运算)
②是否溢出看CF是否为1:最高位进位和SUB异或(OF对补码加/减无意义)
③SF = 1表示负数,SF = 0表示负数
3.4.标志位CF、ZF、OF、SF
1.OF(无符号数无意义):最高位进位和次高位进位异或
2.SF(无符号数无异议):结果的最高位
3.ZF:结果全0,ZF = 1;结果非全0,ZF = 0
4CF.(有符号数无意义):最高位进位和SUB异或
3.5.补充
1.计算机通过当前指令的不同,即进行的微操作不同,对当前进行有符号数/无符号数的计算进行区分,进而让有符号数的加减进行溢出判断时,检查OF;无符号数的加减进行溢出判断时,检查CF
2.加减乘除出现溢出时,并不一定导致异常(内中断):
①硬件:让硬件自动捕捉异常并且发生异常时直接运行中断处理程序
②软件:在执行加减乘除指令后,加上一条陷入指令,由该陷入指令检查溢出是否发生,并且发生时运行中断处理程序
③溢出无所谓,不进行处理
4.乘法溢出1.2n位保存结果:nbit * nbit 结果一定能用2n bit表示(999 * 999 = 998 001,即3位 * 3位一定不超过6位),故当使用2n bit保存结果时,不会发生溢出
2.n位保存结果:只保留后nbit
(1)无符号数:当前nbit全为0时,舍弃前nbit不影响结果的真值,故不发生溢出;当前nbit只要有出现1时,舍弃前nbit就会影响结果的真值,故发生溢出
(2)有符号数:当前n+1bit全为0/1,舍弃前nbit不影响结果的真值,故不发生溢出,当前nbit不是全为0/1,舍弃前nbit就会影响结果的真值,故发生溢出
原因是补码的符号扩展:当n位补码最高位为0时,扩展为2nbit,则扩展的nbit为全0;当n位bit最高位为1时,扩展为2nbit,则扩展的nbit全为1;故前n+1bit全0/全1时,舍弃前nbit不影响真值
5.精度丢失
1.浮点数的表示隐含了一个最高位的1,即计算精度位数时,需要尾数位数 + 1
2.被转换数有效位数 > 转换类型的精度:发生精度丢失
INT类型有1位是符号位,故精度为32 - 1 = 31bit
INT类型精度为31bit,float类型精度为23 + 1 = 24bit → 31 > 24 →可能发生丢失
INT类型精度为31bit,double类型精度为52 + 1 = 53bit → 31 < 53 → 不会发生丢失
6.真题
(1)可以通过软件的方式使用n轮循环加法指令、减法指令、移位指令等价实现乘法操作
(2)控制逻辑控制循环的次数,并且发出右移和加法指令
(3)a即用软件方式实现(2n轮),b即用硬件方式实现(n轮),c即(1轮)