2011 组成原理 补码类型转换 解答题
第 43 题

假定在一个 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 的内容分别是什么(用十六进制表示)?

(2) 执行上述程序段后,变量 m 和 k1 的值分别是多少(用十进制表示)?

(3) 上述程序段涉及带符号整数加/减、无符号整数加/减运算,这四种运算能否利用同一个加法器及辅助电路实现?简述理由。

(4) 计算机内部如何判断带符号整数加/减运算的结果是否发生溢出?上述程序段中,哪些带符号整数运算语句的执行结果会发生溢出?

补码 类型转换

[tag_link]

1)134 = 128 + 6 = 1000 0110B,所以 x 的机器数为 1000 0110B,故 R1 的内容为 86H。246 = 255 - 9 = 1111 0110B,所以 y 的机器数为 1111 0110B。x-y: 1000 0110 + 0000 1010 = (0)1001 0000,括弧中为加法器的进位,故 R5 的内容为 90H。x+y: 1000 0110 + 1111 0110 = (1)0111 1100,括弧中为加法器的进位,故 R6 的内容为 7CH。

2)m 的机器数与 x 的机器数相同,皆为 86H=1000 0110B,解释为带符号整数 m(用补码表示)时,其值为 -1111010B = -122。m-n 的机器数与 x-y 的机器数相同,皆为 90H=1001 0000B,解释为带符号整数 k1(用补码表示)时,其值为 -1110000B = -112。

3)能。n 位加法器实现的是模2n无符号整数加法运算。对于无符号整数 a 和 b,a + b 可以直接用加法器实现,而 a - b 可以通过 a 加上 b 的补数来实现,即 a - b 等价于 a 加上 -b 的补码,结果对 2 的 n 次方取模。因此,n 位无符号整数的加法和减法运算都可以通过 n 位加法器实现。由于带符号整数使用补码表示,其加减法遵循的公式是:a + b 的补码等于 a 的补码加上 b 的补码,结果对 2 的 n 次方取模;同样,a - b 的补码等于 a 的补码加上 -b 的补码,结果也对 2 的 n 次方取模。因此,n 位带符号整数的加减运算也都可以通过 n 位加法器完成。

4)带符号整数加/减运算的溢出判断规则为:若加法器的两个输入端(加法)的符号相同,且不同于输出端(和)的符号,则结果溢出,或加法器完成加法操作时,若次高位的进位和最高位的进位不同,则结果溢出。最后一条语句执行时会发生溢出。因为 10000110+11110110=(1)01111100,括弧中为加法器的进位,根据上述溢出判断规则,可知结果溢出。或因为 2 个带符号整数均为负数,它们相加之后,结果小于 8 位二进制所能表示的最小负数。