假定在一个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。请回答下列问题。(提示:带符号整数用补码表示。)
问答题 执行上述程序段后,寄存器R1、R5和R6的内容分别是什么(用十六进制表示)?
【正确答案】正确答案:134=128+6=10000110B,所以x的机器数为10000110B,故R1的内容为86H。246=255-9=1111 0110B,所以y的机器数为1111 0110B,x-y=10000110+000 1010=(0)1001 0000,括弧中为加法器的进位,故R5的内容为90H。x+y=10000110+1111 0110=(1)0111 1100,括弧中为加法器的进位,故R6的内容为7CH。
【答案解析】
问答题 执行上述程序段后,变量m和k1的值分别是多少(用十进制表示)?
【正确答案】正确答案:m的机器数与x的机器数相同,皆为86H=1000 01 10B,解释为带符号整数m(用补码表示)时,其值为-111 1010B=-122。m-n的机器数与x-y的机器数相同,皆为90H=1001 0000B,解释为带符号整数k1(用补码表示)时,其值为-111 0000B=-112。
【答案解析】
问答题 上述程序段涉及带符号整数加/减、无符号整数加/减运算,这四种运算能否利用同一个加法器及辅助电路实现?简述理由。
【正确答案】正确答案:能。11位加法器实现的是模2 n 无符号整数加法运算。对于无符号整数a和b,a+b可以直接用加法器实现,而a-b可用a加b的补数实现,即a-b=a+[b] (mod 2 n ),所以n位无符号整数加,减运算都可在n位加法器中实现。 由于带符号整数用补码表示,补码加/减法运算公式为:[a+b] =[a] +[b] (mod 2 n ),[a-b] =[a] +[-b] (mod 2 n ),所以n位带符号整数加/减运算都可在n位加法器中实现。
【答案解析】
问答题 计算机内部如何判断带符号整数加/减运算的结果是否发生溢出?上述程序段中,哪些带符号整数运算语句的执行结果会发生溢出?
【正确答案】正确答案:带符号整数加/减运算的溢出判断规则为:若加法器的两个输入端(加法)的符号相同,且不同于输出端(和)的符号,则结果溢出,或加法器完成加法操作时,若次高位(最高数位)的进位和最高位(符号位)的进位不同,则结果溢出。 最后一条语句执行时会发生溢出。因为1000 0110+1111 0110=(1)011 11100,括弧中为加法器的进位,根据上述溢出判断规则,可知结果溢出。或因为2个带符号整数均为负数,它们相加之后,结果小于8位二进制所能表示的最小负数。
【答案解析】解析:考查有符号数和无符号数的表示与转换、加减运算、溢出判断。