(1)
R1装着无符号整型变量x=134=1000 0110(2);
由于y=246=255-9=1111 0110(2)【这样比128+。。逐个算更快】;
把y包括符号位取反再末位+1得到【-y】=0000 1010,
所以【x-y】=【x】+【-y】=1000 0110+0000 1010=(0)1001 0000,括号为加法器的进位,即R5=90H。
同理x+y=R6=1000 0110+1111 0110=(1)0111 1100,R6=7CH。
【注意】无符号的减法见(https://blog.csdn.net/qq_35812205/article/details/108005393,其实下面第三问描述得更规范)
无符号数的减法是用补码的【x-y】补=【x】补+【-y】补运算的);答的是十六进制!!
(2)执行上述程序段后,变量m和k1的值分别为多少?(用十进制表示)
【解析】赋值的过程不改变机器数,即int m=x后,m是对x的机器数用【int型数据的补码解读】为
【补】1000 0110——【原】1111 1010即-111 1010B=-122.(这里计算相反数的十进制可以用128-1-4-1=122)
根据第一行对“赋值”的解释,m-n和机器数和x-y的机器数相同,都是1001 0000H——解释为int型(补码表示)为1111 0000B=-111 0000B=-112.
m-n的机器数与x-y的机器数相同
(3)上述程序段涉及有符号整数加减、无符号整数加减运算,这四种运算能否利用同一个加法器辅助电路实现?简述理由。
【解析】能,n位加法器实现的是模2^n无符号整数加法运算,
1)对于无符号整数a和b,a+b可以直接用加法器实现;
对于无符号数a-b可用a加b的补数实现,即a-b=a+【-b】补 (mod 2^n)。
2)对于有符号整数(补码表示)a和b,【a+b】补=【a】补+【b】补(mod 2^n),
【a-b】补=【a】补+【-b】补(mod 2^n)。
(4)计算机内部如何判断有符号整数加减运算的结果是否发生溢出?上述程序段中,哪些有符号整数运算语句的执行结果会发生溢出?
【解析】运算结果的最高数位(次高位)的进位和最高位(符号位)的进位相同,则结果不溢出。
无符号int k=m-n即x-y运算为
1000 0110
+0000 1010
--------------------
10111 1100(符号位和最高数位的进位不同——溢出)。
【注意】另外可以根据int 的x=-122,y=-10,在8个字长下,预判x-y是不会溢出,x+y=-132超过8位补码能表示范围(-128~127)。