error C4146: 一元負運算符應用於無符號類型,結果仍爲無符號類型

在學習有符號類型整數運算時,會遇到溢出的可能:
如下代碼,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.

發佈了30 篇原創文章 · 獲贊 22 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章