1-1 设机器数字长8位(含1位符号位),若机器数BAH为原码,算术右移一位得到的结果为 9D H 。
T
F
1-2 ALU中采用双符号位判断溢出时直接使用被加数和加数补码的符号位进行判断。
T
F
1-3 在串行定点补码乘法器中,被乘数的符号和乘数的符号都参加运算。
T
F
1-4 在串行定点原码乘法器中,被乘数的符号和乘数的符号都要参加到数值运算中来。
T
F
2-1
int x=100;
x>>2 相当于【】,
x<<3 相当于【】
A.乘2,除3
B.乘4,除8
C.除2,乘3
D.除4,乘8
2-2
CPU中能进行算术运算和逻辑运算的最基本运算部件是。
A.多路选择器
B.ALU
C.加法器
D.移位器
2-3
假设变量x的位数为n(n>=8),x的最低有效字节不变,其余各位全变为0,则对应C语言表达式为。
A.x | ~ 0xFF
B.x ^ 0xFF
C.x | 0xFF
D.x & 0xFF
2-5
若在一个8位整数加/减运算器中完成x+y的运算,已知无符号整数x=69,y=38,则加法器的两个输入端和输入的低位进位分别为
A.0100 0101、1101 1010、1
B.0100 0101、0010 0110、0
C.0100 0101、0010 0110、1
D.0100 0101、1101 1010、0
2-9
字长8位的某二进制补码整数为01011010,则该数的标准移码是()。
A.10111010
B.11011010
C.01011010
D.10101010
2-13
某计算机主频为 1 GHz, 程序 P 运行过程中,共执行了 10 000 条指令,其中,80% 的指令执行平均需 1 个时钟周期,20% 的指令执行平均需 10 个时钟周期。程序 P 的平均 CPI 和 CPU 执行时间分别是:
A.2.8, 28µs
B.28, 28µs
C.2.8, 28ms
D.28, 28ms
2-14
32 位补码所能表示的整数范围是:
A. − 2 32 ∼ 2 31 − 1 −2^{32} \sim 2^{31} −1 −232∼231−1
B. − 2 31 ∼ 2 31 − 1 −2^{31} \sim 2 ^{31} −1 −231∼231−1
C. − 2 32 ∼ 2 32 − 1 −2 ^{32} \sim 2^{32} −1 −232∼232−1
D. − 2 31 ∼ 2 32 − 1 −2^{31} \sim 2^{32} −1 −231∼232−1
2-17
单符号位补码表示的两个同号数相加或异号数相减时,所得结果的符号位SF和进位标志CF进行( )运算为1时,表示运算的结果产生溢出。
A.与
B.与非
C.或
D.异或
2-9
在定点二进制运算器中,减法运算一般通过()来实现。
A.原码运算的二进制减法器
B.补码运算的二进制加法器
C.原码运算的十进制加法器
D.补码运算的二进制减法器
2-10
已知带符号整数用补码表示,变量 x、y、z 的机器数分别为 FFFDH、FFDFH、7FFCH,下列结论中,正确的是:
A.若 x、y 和 z 为无符号整数,则 z
2-11
已知 x、y 为 int 类型,当 x=100、y=200 时,执行“x 减 y”指令得到的溢出标志 OF 和借位标志 CF 分别为 0、1,那么,当 x=10、y=-20 时,执行该指令得到的 OF 和 CF 分别为:
A.OF = 0, CF = 0
B.OF = 0, CF = 1
C.OF = 1, CF = 0
D.OF = 1, CF = 1
3-1 计算机内部的定点数大多用补码表示,下列关于补码特点的叙述中正确的是( )。
A.零的表示是唯一的
B.符号位可以和数值部分一起参加运算
C.减法可用加法来实现
D.正数不存在补码,负数的补码可用反码加1来求得
3-2 下列关于定点运算溢出的描述中,正确的是 ( )。
A.使用补码表示数时,同号数相加可能发生溢出
B.使用补码表示数时,异号数相减可能发生溢出
C.使用补码表示数时,异号数相加不可能发生溢出
D.溢出检测只能用硬件实现,不能用软件实现
4-1
假定带符号整数采用补码表示,若int型变量x和y的机器数分别是FFFFFFDFH和00000041H,则x、y的值分别是 -33
, 65
(填十进制数);以及x-y的机器数是 FFFFFF9E
H.(填十六进制数,位数补齐)
这里考的知识点是 十六进制转十进制,先转为 二进制 再转换为 十进制即可
4-2
假定带符号整数采用补码表示,若int型变量x和y的机器数分别是FFFFFFDDH和0000004DH,则x、y的值分别是 -35
, 77
(填十进制数);以及x-y的机器数是 FFFFFF90
H.(填十六进制数,位数补齐)
4-3
假定在一个8位字长的计算机运行如下C语言程序段。
unsigned int x=134;
unsigned int y=246;
int m=x; int n=y;
unsigned int z1=x-y;
unsigned int z2=x+y;
int k1=m-n;
int k2=m+n;
若编译器编译时将8个8位寄存器R1~R8分别分配给变量x、y、m、n、z1、z2、k1和k2。请回答下列问题(提示:带符号整数用补码表示)。
(1)执行上述程序段后,寄存器R1,R5和R6的内容分别是 86
H, 90
H, 7C
H。(用十六进制大写表示)。
(2)执行上述程序段后,变量m和k1的值分别为 -122
, -112
。(用十进制表示)。
(3)将符号位进位 C f C_f Cf 和最高数据位进位 C d C_d Cd 作为输入,使用 异或
门连接,若 C f C_f Cf 与 C d C_d Cd 数值不同,则表示运算结果发生了 溢出
。(两个空格均填文字)
(1)由于只有八位,要考虑数值溢出的问题 -> 关于无符号数之间的减法
unsigned int x = 134 = 1000 0110 B = 86 H unsigned int y = 246 = 1111 0110 B = F6 H // 这里在运算的时候要把 无符号 当 有符号 的数来运算 unsigned int z1= x - y = x + (-y) = 1000 0110 B (补) + 0000 1010 B (补) = 1001 0000 B = 90 H // 如果溢出了直接舍弃 unsigned int z2= x + y = 1000 0110 B + 1111 0110 B = 0111 1100 B = 7C H
(2)
本来想着运行一下代码就出结果了,但我们的机器是32位,唉~,还是老老实实手算吧int m = x = 1000 0110 B (补) = 1111 1010 B (原) = -122 int n = y = 1111 0110 B (补) = 1000 1010 B (原) = -10 int k1= m - n = m + (-n) = 1000 0110 B (补)+ 0000 1010 B (补) = 1001 0000 B (补) = -121
(3)为什么是这样,请看上面选择题的解析!
4-4
假定在一个8位字长的计算机运行如下C语言程序段。
unsigned int x=144;
unsigned int y=236;
int m=x; int n=y;
unsigned int z1=x-y;
unsigned int z2=x+y;
int k1=m-n;
int k2=m+n;
若编译器编译时将8个8位寄存器R1~R8分别分配给变量x、y、m、n、z1、z2、k1和k2。请回答下列问题(提示:带符号整数用补码表示)。
(1)执行上述程序段后,寄存器R1,R5和R6的内容分别是 90
H, A4
H, 7C
H。(用十六进制大写表示)。
(2)执行上述程序段后,变量m和k1的值分别为 -112
, -92
。(用十进制表示)。
(3)将符号位进位 C f C_f Cf 和最高数据位进位 C d C_d Cd 作为输入,使用 异或
门连接,若 C f C_f Cf 与 C d C_d Cd 数值不同,则表示运算结果发生了 溢出
。(两个空格均填文字)
(1)由于只有八位,要考虑数值溢出的问题 -> 关于无符号数之间的减法
unsigned int x = 144 = 1001 0000 B = 90 H unsigned int y = 236 = 1110 1100 B = EC H // 这里在运算的时候要把 无符号 当 有符号 的数来运算 unsigned int z1= x - y = x + (-y) = 1001 0000 B (补) + 0001 0100 B (补) = 1010 0100 B = A4 H // 如果溢出了直接舍弃 unsigned int z2= x + y = 1001 0000 B + 1110 1100 B = 0111 1100 B = 7C H
(2)
本来想着运行一下代码就出结果了,但我们的机器是32位,唉~,还是老老实实手算吧int m = x = 1001 0000 B (补) = 1111 0000 B (原) = -112 int n = y = 1110 1100 B (补) = 1001 0100 B (原) = -20 int k1= m - n = m + (-n) = 1001 0000 B (补)+ 0001 0100 B (补) = 1010 0100 B (补) = -92
(3)为什么是这样,请看上面选择题的解析!
4-5
华科教材P92(5)类型1:整数x的机器数为11111101分别对x进行逻辑右移1位和算术右移1位操作,得到的机器数分别是 01111110
、 11111110
(填写补足8位二进制)
逻辑左移 = 算数左移,右边统一添0
逻辑右移,左边统一添0
算数右移,左边添加的数和符号有关
参考: 逻辑左移、算术左移、逻辑右移、算术右移区别、算术移位和逻辑移位详解
4-6
华科教材P92(5)类型2:整数x的机器数为11111100分别对x进行逻辑右移1位和算术右移1位操作,得到的机器数各是 01111110
、 11111110
(填写补足8位二进制)
逻辑左移 = 算数左移,右边统一添0
逻辑右移,左边统一添0
算数右移,左边添加的数和符号有关
参考: 逻辑左移、算术左移、逻辑右移、算术右移区别、算术移位和逻辑移位详解
4-7
某字长为8位的计算机中,已知整型变量x、y的机器数分别为 [ x ] 补 = 11111000 [x]_补 =11111000 [x]补=11111000 , [ y ] 补 = 11101110 [y]_补 =11101110 [y]补=11101110,若整型变量z=2*x+y/2,则z的机器数为 11100111
(填写补足8位二进制)。。
4-8
某字长为8位的计算机中,已知整型变量x、y的机器数分别为 [ x ] 补 = 11101110 [x]_补 =11101110 [x]补=11101110, [ y ] 补 = 11100100 [y] _补 =11100100 [y]补=11100100,若整型变量z=2*x+y/2,则z的机器数为 11001110
(填写补足8位二进制)。
4-9
采用IEEE754单精度浮点数格式计算下列表达式的值。
(1)0.25+(-6.625) (2)0.25-(-6.625)
按步骤填空:
(1)将0.25用二进制表示:二进制结果为 0.01
;6.625的二进制结果为:110.101
。
(2)将二进制数规格化,即转成1.M的形式:0.25的二进制的小数点必须向右移动 1
位。6.625的二进制的小数点必须向左移动 2
位。
(3)通过公式求出阶码的值:0.25的阶码为 01111110
(填写补足8位二进制)。-6.625的阶码为 10000001
(填写补足8位二进制)。
(4)将S、E以及尾域M转成二进制进行合码,最后得到IEEE754浮点数二进制的存储形式,用十六进制表示为0.25为0x 3E800000
;- 6.625为0x C0D40000
。
(5)对阶:用0.25的阶码减去-6.625的阶码可以求出差值为: -3
(填写十进制)
(6)尾数计算:从对阶结果可以看出,需要对x进行对阶。所以对0.25的尾数进行计算,将尾数右移 3
位,得出结果。尾数相加:根据题目对尾数进行带符号相加操作,最后得出结果后与阶码相结合,这里要注意尾数相加后的符号变化。
(7)最后将S、阶码和尾数相互结合,将其用十六进制表示为0x C0CC0000
,转成10进制数就是-6.375。
(8)同理:0.25-(-6.625)尾数计算有变化,得出结果用二进制用十六进制表示为0x 40DC0000
4-10
计算机字长为8位,若 x = - 1101100,则 [x/4]补 的二进制编码为 11100101
(直接填写二进制数)
4-11
(可参考教材P70内容)这是关于原码一位乘公式推导的题:
假设乘数Y=-0.1011,可推导下列式子:
|X| * |Y|
= |X| * 0.1011
= 0.1* |X| + 0.00* |X| + 0.001* |X| + 0.0001* |X|
=0.1* |X| + 0.00* |X| + 0.001* (|X| +0.1
* |X|)
= 0.1* |X| +0.01
* [0* |X| + 0.1* (|X| + 0.1* |X|) ]
= 0.1*{ |X| + 0.1* [0* |X| + 0.1* (|X| + 0.1* |X|) ]}
= 2 − 1 2^{−1} 2−1{ |X| + 2 − 1 2^{−1} 2−1* [0* |X| + 2 − 1 2^{−1} 2−1* (|X| + 2 − 1 2^{−1} 2−1* |X|) ]}
= 2 − 1 2^{−1} 2−1{ |X| + 2 − 1 2^{−1} 2−1* [0* |X| + 2 − 1 2^{−1} 2−1* (|X| + 2 − 1 2^{−1} 2−1* (|X| + P 0 P_{0} P0 ) ) ]}
= 2 − 1 2^{−1} 2−1{ |X| + 2 − 1 2^{−1} 2−1* [0* |X| + 2 − 1 2^{−1} 2−1* (|X| + P 1 P_{1} P1 ) ]}
= 2 − 1 2^{−1} 2−1{ |X| + 2 − 1 2^{−1} 2−1* [0* |X| +$P_{2} ]}
= 2 − 1 2^{−1} 2−1{ |X| + P 3 P_{3} P3 }
= P 4 P_{4} P4
(1)因此,乘法运算X * Y可以使用原码一位乘进行运算,即得到递归公式 P i + 1 = ( P i + y n − i ∗ ∣ x ∣ ) ∗ 2 − 1 ( i = 0 , 1 , 2 , … … , n − 1 ) P_{i+1}=(P_i +y_{n−i} * |x|)*2^{−1} (i=0,1,2,……,n-1) Pi+1=(Pi+yn−i∗∣x∣)∗2−1(i=0,1,2,……,n−1),
其中 P i + 1 P_{i+1} Pi+1 称为部分积,初始值 P 0 P_{0} P0 = 0
。
(2)设置一个累加寄存器存放部分积,每得到一个位积就将位积累加到累加寄存器中,然后 逻辑
右移一位得到新的 P i P_{i} Pi 值。
(3)最后,通过 异或
门电路即单独计算出x * y乘积的符号位。
5-1 这是一道判断整数加法是否溢出的题。本题目要求将程序填空。
这是一道判断整数加法是否溢出的题。例如:本题目要求将判断溢出的函数填空。
#include
int checkadd_ok(int x, int y)
{
int sum = x + y ;
if(x>0 && y>0 && sum<0)
{
return 1 ;
}
if(x<0 && y<0 && !(sum<0))
{
return -1 ;
}
return 0 ;
}
int main()
{
int a = 0;
int b = 0;
while(~scanf("%d %d",&a,&b))
{
if( checkadd_ok(a,b) == 0 )
{
printf("a+b没有发生溢出\n");
}
else
{
if( checkadd_ok(a,b) == -1 )
printf("a+b发生负溢\n");
else if( checkadd_ok(a,b) == 1)
printf("a+b发生正溢\n");
}
}
return 0;
}
输入样例:
1 2
输出样例:
a+b没有发生溢出
首先分析 int checkadd_ok(int x, int y) 函数,可以看到有两个 if,如果没有进入 if 的话就返回 0 ,大概可以退出这是没有发生溢出的情况 。
第一个 if 的前两个条件是判断 a 和 b 是否都大于零,由此判断是正溢出的情况,当正溢出时,结果为负数,所以第一空填 sum<0。
第二个 if 的前两个条件是判断 a 和 b 是否都小于零,由此判断是负溢出的情况,当负溢出时,结果为正数,但这个空有取反,则要判断结果是否为负,所以第二空也为 sum<0 。
到这里就知道函数 int checkadd_ok(int x, int y) 的功能了,没有溢出返回 0 ,正溢出返回 1 ,负溢出返回 -1 ,所以 第三空是 0,第四空是 -1 ,第五空是 1 。
5-2 这是一道判断整数乘数是否溢出的题。本题目要求将程序填空。
这是一道判断整数乘数是否溢出的题。
#include
int checkmul_ok(int x, int y)
{
int acc = x * y ;
if( !x || 填空 )
{
return 1 ;
}
return 4 ;
}
int main()
{
int a = 填空;
int b = 填空;
scanf("%d %d",&a,填空);
if( checkmul_ok(a,b) == 填空)
{
printf("non-overflow\n");
}
else
{
printf("overflow\n");
}
}
return 0;
输入样例
1 2
输出样例
non-overflow
会写这一题的可以私信我补上答案或发评论区哦!