2011-09-22 77 views
8

我有以下代碼:奇怪的警告行爲和符號/無符號比較

unsigned int a; 
if (a > numeric_limits<int>::max()) 
    do_stuff(); 

編譯時,GCC抱怨

警告: 「比較之間簽署和未簽署」

好的,我明白了

但是,用下面的代碼:

unsigned int a; 
if (a > (numeric_limits<int>::max())) 
    do_stuff(); 

警告不再顯示,我真的不知道爲什麼...... 是否有這樣的行爲有任何合乎邏輯的理由還是我做錯了什麼?

+1

試過[模擬這種行爲(HTTP:// WWW。 ideone.com/5NZL9)。但它顯示警告。 – iammilind

+0

周圍的代碼是什麼? – quasiverse

+0

do_stuff()部分只包含拋出異常。沒有周圍的代碼,因爲這是函數中的唯一行。但是,該功能用於大型項目。我嘗試了iammilind提供的代碼,但沒有出現警告。這裏是我用來編譯程序的gcc選項'-Wall -ansi -pedantic -Wno-long-long' – malamioute

回答

-1

答案在於gcc處理intunsigned int的方式。

unsigned intint都存儲2字節的值。它們之間的差異是unsigned int不支持負值。它只能存儲0-65,535的值。 當GCC看到int和unsigned int之間的比較時,它將int轉換爲正數。例如,如果int的值是-2,它會將其轉換爲2.但是,如果int在前面是()運算符。 (INT)。海灣合作委員會將其解釋爲一個正數(但仍將其轉換),並且不會給出警告。

+0

'int'通常不是一個「2字節值」,而不是現在實際使用的幾乎任何C++編譯器。 –

4

這是因爲它是一個錯誤。見bug 50012

0

我目前沒有訪問C++編譯器,以測試這一點,但我認爲這可能沒有任何警告的工作:

unsigned int a; 
if (a > numeric_limits<unsigned int>::max()) 
    do_stuff(); 
+0

這應該肯定會產生一個警告(聲明總是錯誤的)! – UncleBens

+0

爲了得到相同的結果,沒有警告會採用'if(a> unsigned(numeric_limits :: max()))''。 – UncleBens

+0

我現在也看到了。 'a'不能大於'0xffffffff',所以'if(a> unsigned(numeric_limits :: max()))'正確,就像@UncleBens所表示的那樣。 – npclaudiu

相關問題