问答题
假定在一个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的内容分别是什么?(用十六进制表示)
【正确答案】 寄存器R1存储的是134,转换成二进制为1000 0110B,即86H。寄存器R5存储的是x-y的内容,x-y=-112,转换成二进制为1001 0000B,即90H。寄存器R6存储的是x+y的内容,x+y=380,转换成二进制为{{U}}1{{/U}} 0111 1100B(前面的进位舍弃),即7CH。由于计算机字长为8位,因此无符号整数能表示的范围为0~255,而x+y=380,故溢出。
【答案解析】
问答题
执行上述程序段后,变量m和k1的值分别是多少?(用十进制表示)
【正确答案】 m二进制表示为1000 0110B,由于m是int型,因此最高位为符号位,可以得出m的原码为1111 1010(对1000 0110除符号位取反加1),即-122。同理,n的二进制表示为1111 0110B,故n的原码为1000 1010,转成十进制为-10。因此,k1=-122-(-10)=-112。
【答案解析】
问答题
上述程序段涉及带符号整数加/减、无符号整数加/减运算,这4种运算能否利用同一个加法器及辅助电路实现?简述理由。
【正确答案】 可以利用同一个加法器及辅助电路实现。因为无符号整数和有符号整数都是以补码形式存储,所以运算规则都是一样的。但有一点需要考虑,由于无符号整数和有符号整数的表示范围是不一样的,因此需要设置不一样的溢出电路。
【答案解析】
问答题
计算机内部如何判断带符号整数加/减运算的结果是否发生溢出?上述程序段中,哪些带符号整数运算语句的执行结果会发生溢出?
【正确答案】 至于内部如何判断溢出,可参考前面的总结。带符号整数只有k2会发生溢出。分析:8位带符号整数的补码取值范围为-128~+127,而k2=m+n=-122-10=-132,超出范围。而k1=-112,在范围-128~+127之内。
【答案解析】
提交答案
关闭