深入理解計算機系統 練習題2.32 答案與分析
阿新 • • 發佈:2019-01-28
錯誤示例
#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;
}