.
{ return (int) (( word <<24) >> 24); }
int func2(unsigned word) { return ( (int) word <<24 ) >> 24; }
假设在一个32位机器上执行这些函数,该机器使用二进制补码表示带符号整数。无符号数采用逻辑移位,带符号整数采用算术移位。请填写下表,并说明函数func1和func2的功能。 W 机器数 0000 007FH 0000 0080H 0000 00FFH 0000 0100H 值 127 128 255 256 func1(w) 机器数 0000 007FH 0000 0080H 0000 00FFH 0000 0000H 值 +127 +128 +255 0 func2(w) 机器数 0000 007FH FFFF FF80H FFFF FFFFH 0000 0000H 值 +127 –128 –1 0 函数func1的功能是把无符号数高24位清零(左移24位再逻辑右移24位),结果一定是正的有符号数;而函数func2的功能是把无符号数的高24位都变成和第25位一样,因为左移24位后进行算术右移,高24位补符号位(即第25位)。
4.填写下表,注意对比无符号数和带符号整数的乘法结果,以及截断操作前、后的结果。
模式 无符号数 二进制补码 无符号数 二进制补码 无符号数 二进制补码 x 机器数 110 110 001 001 111 111 值 6 –2 1 +1 7 –1 机器数 010 010 111 111 111 111 y 值 2 +2 7 –1 7 –1 x×y(截断前) 机器数 001100 111100 000111 111111 110001 000001 值 12 –4 7 –1 49 +1 x×y(截断后) 机器数 100 100 111 111 001 001 值 4 –4 7 –1 1 +1
5.以下是两段C语言代码,函数arith( )是直接用C语言写的,而optarith( )是对arith( )函数以某个确定的
M和N编译生成的机器代码反编译生成的。根据optarith( ),可以推断函数arith( ) 中M和N的值各是多少?
#define M #define N int arith (int x, int y) {
int result = 0 ;
result = x*M + y/N; return result; }
精品
.
int optarith ( int x, int y) {
int t = x; x << = 4; x - = t;
if ( y < 0 ) y += 3; y>>2;
return x+y;
参考答案:
可以看出x*M和“int t = x; x << = 4; x-=t;”三句对应,这些语句实现了x乘15的功能(左移4位相当于乘以16,然后再减1),因此,M等于15;
y/N与“if ( y < 0 ) y += 3; y>>2;”两句对应,功能主要由第二句“y右移2位”实现,它实现了y除以4的功能,因此N是4。而第一句“if ( y < 0 ) y += 3;”主要用于对y=–1时进行调整,若不调整,则–1>>2=–1而–1/4=0,两者不等;调整后 –1+3=2,2>>2=0,两者相等。
思考:能否把
if ( y < 0 ) y += 3; 改成 if ( y < 0 ) y += 2; ?
不能!因为y = - 4时不正确。
6.设A4A1和B4B1分别是四位加法器的两组输入,C0为低位来的进位。当加法器分别采用串行进位和先行进位时,写出四个进位C4 C1的逻辑表达式。 参考答案: 串行进位:
C1 = X1C0+Y1C0 + X1 Y1 C2 = X2C1+Y2C1 + X2 Y2 C3 = X3C2+Y3C2 + X3 Y3 C4 = X4C3+Y4C3 + X4 Y4
并行进位:
C1 = X1Y1 + (X1+Y1)C0
C2 = X2Y2 + (X2 +Y2) X1Y1 + (X2+Y2) (X1+Y1)C0
C3 = X3Y3 + (X3 + Y3) X2Y2 + (X3 + Y3) (X2 + Y2) X1Y1 + (X3 + Y3) (X2 + Y2)(X1 + Y1)C0
C4=X4Y4+(X4+Y4)X3Y3+(X4+Y4)(X3+Y3)X2Y2+(X4+Y4)(X3+Y3)(X2+Y2)X1Y1+(X4+Y4)(X3+Y3) (X2+Y2)(X1+Y1)C0
7.用SN74181和SN74182器件设计一个16位先行进位补码加/减运算器,画出运算器的逻辑框图,并给出零标志、进位标志、溢出标志、符号标志的生成电路。 参考答案(图略):
逻辑框图参见教材中的图3.15和图3.16,将两个图结合起来即可,也即只要将图3.15中的B输入端的每一位Bi取反,得到Bi,和原码Bi一起送到一个二路选择器,由进位C0作为选择控制信号。当C0为1时做减法,此时,选择将Bi作为SN74181的B输入端;否则,当C0为1时,做加法。
零标志ZF、进位标志CF、溢出标志OF、符号标志SF的逻辑电路根据以下逻辑表达式画出即可。 ZF=F15+F14+F13+F12+F11+F10+F9+F8+F7+F6+F5+F4+F3+F2+F1+F0 CF=C16
精品
.
OF= C0(A15B15F15 + A15B15F15)+ C0(A15B15F15 + A15B15F15) SF= F15
8. 用SN74181和SN74182器件设计一个32位的ALU,要求采用两级先行进位结构。
(1) 写出所需的SN74181和SN74182芯片数。 (2) 画出32位ALU的逻辑结构图。 参考答案(图略):
将如图3.15所示的两个16位ALU级联起来即可,级联时,低16位ALU的高位进位C16作为高16位ALU的低位进位C0,因此,只要用8片SN74181和2片SN74182。
9.已知x = 10,y = – 6,采用6位机器数表示。请按如下要求计算,并把结果还原成真值。
(1) 求[x+y]补,[x–y]补。 (2) 用原码一位乘法计算[x×y]原。 (3) 用MBA(基4布斯)乘法计算[x×y]补。 (4) 用不恢复余数法计算[x/y]原的商和余数。 (5) 用不恢复余数法计算[x/y]补的商和余数。 参考答案:
[10]补 = 001010 [–6]补 = 111010 [6]补 = 000110 [10]原 = 001010 [–6]原 = 100110 (1) [10+(– 6)]补= [10]补+[– 6]补= 001010+111010 = 000100 (+4)
[10–(–6)]补= [10]补+[– (–6)]补 = 001010+000110 = 010000 (+16)
(2) 先采用无符号数乘法计算001010× 000110的乘积,原码一位乘法过程(前面两个0省略)如下:
C P Y 说明 0 0 0 0 0 0 1 1 0 P0 = 0
+ 0 0 0 0 y4 = 0,+0
0 0 0 0 0 C, P 和Y同时右移一位 0 0 0 0 0 0 0 1 1 得P1
+ 1 0 1 0 y3 = 1,+X
0 1 0 1 0 C, P 和Y同时右移一位 0 0 1 0 1 0 0 0 1 得P2
+ 1 0 1 0 y2 = 1,+X
0 1 1 1 1 0 0 0 0 C, P 和Y同时右移一位 0 0 1 1 1 1 0 0 0 得P3
+ 0 0 0 0 y1 = 0,+0
0 0 1 1 1 C, P 和Y同时右移一位 0 0 0 1 1 1 1 0 0 得P4
若两个6位数相乘的话,则还要右移两次,得 000000 111100
符号位为:0 1 = 1,因此,[X×Y]原 = 1000 0011 1100 即X × Y = –11 1100B = – 60
(3) [–10]补 = 110110,布斯乘法过程如下:
P Y y-1 说明
0 0 0 0 0 0 1 1 1 0 1 0 0 设y-1 = 0,[P0]补 = 0
y0 y-1 = 00,P、Y直接右移一位
0 0 0 0 0 0 0 1 1 1 0 1 0 得[P1]补
精品
.
+ 1 1 0 1 1 0 y1 y0 =10,+[–X]补 1 1 0 1 1 0 P、Y同时右移一位 1 1 1 0 1 1 0 0 1 1 1 0 1 得[P2]补
+ 0 0 1 0 1 0 y2 y1 =01,+[X]补 0 0 0 1 0 1 P、Y同时右移一位
0 0 0 0 1 0 1 0 0 1 1 1 0 得[P3]补
+ 1 1 0 1 1 0 1 0 0 1 1 1 0 y3 y2 = 10,+[–X]补 1 1 1 0 0 0 P、Y同时右移一位 1 1 1 1 0 0 0 1 0 0 1 1 1 得[P4]补 + 0 0 0 0 0 0 0 1 0 0 1 1 1 y4 y3 = 11,+0
1 1 1 1 0 0 P、Y同时右移一位 1 1 1 1 1 0 0 0 1 0 0 1 1 得[P5]补 + 0 0 0 0 0 0 0 0 1 0 0 1 1 y5 y4 = 11,+0
1 1 1 1 1 0 P、Y同时右移一位 1 1 1 1 1 1 0 0 0 1 0 0 1 得[P6]补
因此,[X × Y]补=1111 1100 0100,即X × Y = –11 1100B= – 60
(4) 因为除法计算是2n位数除n位数,所以[6]原=0110,[10]原=0000 1010,[–6]补=1010,
商的符号位:0 1 = 1,运算过程(前面两个0省略)如下: 余数寄存器R 余数/商寄存器Q 说 明 0 0 0 0 1 0 1 0 开始R0 = X + 1 0 1 0 R1 = X–Y 1 0 1 0 1 0 1 0 0 R1< 0,则q 4 = 0,没有溢出 0 1 0 1 0 1 0 0 2R1(R和Q同时左移,空出一位商)
+ 0 1 1 0 R2 = 2R1+Y 1 0 1 1 0 1 0 0 0 R2 < 0,则q 3 = 0 0 1 1 0 1 0 0 0 2R2 (R和Q同时左移,空出一位商)
+ 0 1 1 0 R3 = 2R2 +Y 1 1 0 0 1 0 0 0 0 R3 < 0,则q 2 = 0 1 0 0 1 0 0 0 0 2R3 (R和Q同时左移,空出一位商)
+ 0 1 1 0 R3 = 2R2 +Y 1 1 1 1 0 0 0 0 0 R4 < 0,则q1 = 0 1 1 1 0 0 0 0 0 2R4 (R和Q同时左移,空出一位商)
+ 0 1 1 0 R5 = 2R4 +Y 0 1 0 0 0 0 0 0 1 R5 > 0,则q 0 = 1 商的数值部分为:00001。所以,[X/Y]原=00001 (最高位为符号位),余数为0100。
(5) 将10和–6分别表示成补码形式为:[10] 补 = 0 1010 , [–6] 补 = 1 1010,计算过程如下:
先对被除数进行符号扩展,[10] 补=00000 01010,[6] 补 = 0 0110 余数寄存器R 余数/商寄存器Q 说 明
0 0 0 0 0 0 1 0 1 0 开始R0 = [X] + 1 1 0 1 0 R1=[X] +[Y] 1 1 0 1 0 0 1 0 1 0 R1与[Y]同号,则q5 =1 1 0 1 0 0 1 0 1 0 1 2R1(R和Q同时左移,空出一位上商1) +0 0 1 1 0 R2 = 2R1+[–Y]
1 1 0 1 0 1 0 1 0 1 R2与[Y]同号,则q4= 1,
精品
.
1 0 1 0 1 0 1 0 1 1 2R2(R和Q同时左移,空出一位上商1) + 0 0 1 1 0 R3 = 2R2 +[-Y] 1 1 0 1 1 0 1 0 1 1 R3与[Y]同号,则q3 = 1
1 0 1 1 0 1 0 1 1 1 2R3(R和Q同时左移,空出一位上商1) + 0 0 1 1 0 R4 = 2R3 +[–Y] 1 1 1 0 0 1 0 1 1 1 R4与[Y]同号,则q 2 = 1 1 1 0 0 1 0 1 1 1 1 2R4 (R和Q同时左移,空出一位上商0) + 0 0 1 1 0 R5= 2R4 +[-Y] 1 1 1 1 1 0 1 1 1 1 R5与[Y]同号,则q1= 1,
1 1 1 1 0 1 1 1 1 1 2R5 (R和Q同时左移,空出一位上商1) + 0 0 1 1 0 R6= 2R5 +[–Y] 0 0 1 0 0 1 1 1 1 0 R6与[Y]异号,则q 0 = 0,Q左移,空出一位上商1 + 0 0 0 0 0 + 1 商为负数,末位加1;余数不需要修正 0 0 1 0 0 1 1 1 1 1 所以,[X/Y] 补=11111,余数为00100。
即:X/Y= – 0001B = – 1,余数为 0100B = 4
将各数代入公式“除数×商+余数= 被除数”进行验证,得:(–6)×(–1) +4= 10。
10.若一次加法需要1ns,一次移位需要0.5ns。请分别计算用一位乘法、两位乘法、基于CRA的阵列乘
法、基于CSA的阵列乘法四种方式计算两个8位无符号二进制数乘积时所需的时间。 参考答案:
一位乘法:8次右移,8次加法,共计12ns; 二位乘法:4次右移,4次加法,共计6ns; 基于CRA的阵列乘法:每一级部分积不仅依赖于上一级部分积,还依赖于上一级最终的进位,而每
一级进位又是串行进行的,所以最长的路径总共经过了8+2×(8–1)=22次全加器,共计约22ns; 基于CSA的阵列乘法:本级进位和本级和同时传送到下一级,同级部分积之间不相互依赖,只进行O(N)次加法运算,因此,共计约8ns。 11.在IEEE 754浮点数运算中,当结果的尾数出现什么形式时需要进行左规,什么形式时需要进行右规?
如何进行左规,如何进行右规? 参考答案:
(1) 对于结果为±1x .xx……x的情况,需要进行右规。右规时,尾数右移一位,阶码加1。右规操作可以表示为:M bM b ×2 -1,EbEb+1。右规时注意以下两点:
a) 尾数右移时,最高位“1”被移到小数点前一位作为隐藏位,最后一位移出时,要考虑舍入。 b) 阶码加1时,直接在末位加1。
(2) 对于结果为±0.00……01x……x的情况,需要进行左规。左规时,数值位逐次左移,阶码逐次减1,直到将第一位“1”移到小数点左边。假定k为结果中“±”和左边第一个1之间连续0的个数,则左规操作可以表示为:M bM b ×2k,EbEb–k。左规时注意以下两点:
a) 尾数左移时数值部分最左k个0被移出,因此,相对来说,小数点右移了k位。因为进行尾数相加时,默认小数点位置在第一个数值位(即:隐藏位)之后,所以小数点右移k位后被移到了第一位1后面,这个1就是隐藏位。
b) 执行EbEb–k时,每次都在末位减1,一共减k次。
12.在IEEE 754浮点数运算中,如何判断浮点运算的结果是否溢出?
精品