深入理解计算机系统 练习题2.32 答案与分析

错误示例

#include <stdio.h>  
#include "stdafx.h"
#include <iostream>


using namespace std;

int tadd_ok(int x, int y) {
    int sum = x + y;
    int neg_over = x < 0 && y < 0 && sum >= 0;
    int pos_over = x >= 0 && y >= 0 && sum < 0;

    return !neg_over && !pos_over;
}

int tsub_ok(int x, int y) {
    return tadd_ok(x, -y);
}
int main() {
    int x = 1;
    int y = INT_MIN;
    cout << INT_MAX << endl;
    cout << y << endl;
    cout << -y << endl;
    tsub_ok(x,y);
}

打印结果
这里写图片描述
此问题的原因在于当y = INT_MIN时,y = -y,为什么y = -y因为-2147483648求反理论上应该是2147483648,从而使-y + y =0,但是由于有符号数的最大值是2147483647,所以出现溢出,有定义可知,当y = INT_MIN时,-y=INT_MIN,从而造成代码异常
修改为

#include <stdio.h>  
#include "stdafx.h"
#include <iostream>


using namespace std;

int tadd_ok(int x, int y) {
    int sum = x + y;
    if (y == INT_MIN) {
        int neg_over = x < 0;
        return !neg_over ;
    }
    else {
        int neg_over = x < 0 && y < 0 && sum >= 0;
        int pos_over = x >= 0 && y >= 0 && sum < 0;
        return !neg_over && !pos_over;
    }


}

int tsub_ok(int x, int y) {
    return tadd_ok(x, -y);
}
int main() {
    int x = 1;
    int y = INT_MIN;
    cout << INT_MAX << endl;
    cout << y << endl;
    cout << -y << endl;
    cout << tsub_ok(x, y) << endl;
}

猜你喜欢

转载自blog.csdn.net/ciqingloveless/article/details/82747045