在學習有符號類型整數運算時,會遇到溢出的可能:
如下代碼,tadd_ok函數能檢測計算結果是否溢出
#include<iostream>
using namespace std;
//判斷是否溢出,返回1則不溢出,0則溢出
int tadd_ok(int x, int y)
{
int sum = x + y;
if ((x > 0 && y > 0 && sum < 0)
|| (x < 0 && y < 0 && sum > 0))
return 0; //overflow
else
return 1;
}
int main()
{
int x = 1073741824;
int y = -2147483647 - 1;
//int y = -2147483648 error C4146: 一元負運算符應用於無符號類型,結果仍爲無符號類型
cout << "-y: " << -y << endl; //-y = -2147483648
cout << tadd_ok(x, -y) << endl; //1
cout << tadd_ok(x, y) << endl; //1
return 0;
}
輸出:
-y: -2147483648
1
1
有幾點問題:
1、出現error C4146的情況:看上去用int y=-2147483647-1;
和用int y=-2147483648
一個意思,其實後者會出現錯誤。
原因在於 C的頭文件limit.h中定義了int類型的最大值和最小值INT_MAX 和INT_MIN:
#define INT_MAX 2147483647
#define INT_MIN (-INT_MAX - 1)
對於int y=-2147483648
,編譯器會理解成對一個int值進行一元運算,顯然已經溢出。
2、-y=-2147483648
,而不是2147483648,因爲這超過了INT_MAX,機器碼爲0x80000000,所以仍然是-2147483648.