错误示例
#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;
}