1. 程式人生 > >深入理解計算機系統 練習題2.32 答案與分析

深入理解計算機系統 練習題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; }