csapp3e.2.73
时间: 2023-10-17 12:02:44 浏览: 47
题目:CSAPP 3e.2.73
问题描述:
假设有一个计算机系统,它的字长为32位,采用补码表示整数。我们知道,计算机系统中常常会有溢出现象,即计算结果超过了可以表示的范围。例如,在一个32位字长的系统中,如果两个整数相加的结果大于$2^{31}-1$,则会发生溢出。对于一个32位字长的系统,请回答以下问题:
a) 哪些情况下会发生溢出?
b) 对于每一种可能的溢出,可以通过观察操作数的哪些位的信息来判断是否发生了溢出?同时,给出通过观察操作数的哪几位信息可以判断溢出的逻辑表达式。
c) 假设我们用C语言编写一个函数,接受两个32位整数作为参数,判断它们相加是否发生溢出。请给出这个函数的代码实现。
回答:
a) 发生溢出的情况包括两个整数正负相同,相加结果的符号与操作数不同;或者两个整数正负相反,相加结果的符号与较大的操作数相同。
b) 如果两个整数正负相同,那么溢出发生当且仅当相加结果的高31位与操作数不同;如果两个整数正负相反,那么溢出发生当且仅当相加结果的高31位与较大的操作数相同。
c) 我们可以将两个操作数的高31位与其符号位进行比较,来判断溢出是否发生。其中较大的操作数的高31位可以通过逻辑与运算符(&)提取,符号位可以通过右移31位获得。相关代码如下:
```C
int int_add_overflow(int x, int y) {
int sum = x + y;
int sign_x = x >> 31;
int sign_y = y >> 31;
int sign_sum = sum >> 31;
return (sign_x == sign_y) && (sign_x != sign_sum);
}
```
以上函数返回1表示溢出发生,返回0表示未发生溢出。