假定在一个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的内容分别是什么?(用16进制表示) 2) 执行上述程序段后,变量m和k1的值分别是多少?(用十进制表示) 3) 上述程序段涉及带符号整数加/减、无符号整数加/减运算,这四种运算能否利用同一个加法器及辅助电路实现?简述理由。 4) 计算机内部如何判断带符号整数加/减运算的结果是否发生溢出?上述程序段中,哪些带符号整数运算语句的执行结果会发生溢出?
时间: 2023-06-09 13:08:24 浏览: 181
1) R1 = 86, R5 = 0xFFFFFFEC, R6 = 0x0000007C
2) m = -122, k1 = -112
3) 带符号整数加/减和无符号整数加/减需分别使用不同的电路实现。原因是带符号整数加/减需要进行符号位的判断、扩展和溢出判断等处理,而无符号整数加/减则不需要考虑符号位。
4) 通过比较运算结果和运算数的符号位可以判断是否发生溢出。在程序段中,带符号整数运算语句 "int k1=m-n" 的执行结果会发生溢出,因为相减后得到的结果 -112 超出了16位有符号整数的表示范围 [-32768, 32767]。
相关问题
32位字长,采用非边界对齐的方法,一个int类型的数据存放在主存中,cpu会怎么读
在非边界对齐的情况下,一个 int 类型的数据可能会跨越两个存储单元。以 2 个存储单元存储一个 int 类型数据为例,假设这个 int 类型的数据的地址为 A,其值为 12345678,其在内存中存放的方式可能如下图所示:
```
+-----------+-----------+
| 11001100 | 01000010 | <- 地址 A
+-----------+-----------+
```
其中,12345678 的二进制表示为 `0000 1011 0101 1100 1100 0110 0100 1110`,在这里,我们将其拆分为 2 个字节,分别存放在地址 A、A+1 处。
CPU 读取这个 int 类型数据时,需要先将地址 A 发送给内存控制器,内存控制器会将该地址所对应的 4 字节数据块全部读取到 CPU 的寄存器中,然后 CPU 会根据数据类型的大小和存放方式,将这些数据重新组合成一个 int 类型的数据。具体地,CPU 可以通过以下步骤完成这个任务:
1. 将地址 A 的数据和地址 A+1 的数据进行拼接,得到 `11001100 01000010`;
2. 将步骤 1 得到的 2 字节数据转换为 int 类型的数据,即得到原始的数值 12345678。
可以看出,在非边界对齐的情况下,CPU 读取一个 int 类型的数据只需要进行一次读取和拼接操作,相对于 double 类型的数据来说,速度较快。
设计算机字长为 8位 ,两个十进制数 X = -97 ,Y = -63, [x]补 -[y]补 的结果为负溢出,请写出步骤
由于本题中数值范围超过了 8 位二进制补码能够表示的范围,相减的结果会产生负溢出,即结果无法用 8 位二进制补码表示。
首先,我们将 X 和 Y 转换为补码形式:
-97 的原码为 1000 0001,补码为 0111 1111
-63 的原码为 1000 0001,补码为 1100 0001
然后,我们需要求出 [x]补 和 -[y]补:
[x]补 = 1000 0001 (-97 的原码)
-[y]补 = 0011 1111 (-63 的补码取反加一)
接下来,我们进行补码相加,得到结果:
0111 1111 (x的补码)
+ 1100 0001 (-y的补码)
------------
1 0011 0000
因为我们设计的字长是 8 位,而结果却需要 9 位,所以会发生负溢出。第 9 位即为最高位,值为 1,表示结果为负数。而前面的 0011 0000 是一个无效的结果,因为它已经超出了 8 位补码的表示范围。
因此,[x]补 - [-y]补 的结果为负溢出。