2012-06-25 42 views
2

我正在與海灣合作委員會v4.4.5,我notived缺省整數推廣計劃,我沒有預料到。海灣合作委員會,奇怪的整數推廣計劃

要激活足夠的警告來防止隱含的錯誤我激活了選項-WConversion,從那時起我注意到,當我執行下面的代碼時,警告「從'int'轉換爲'short int'可能會改變它值「存在。

signed short sA, sB=1, sC=2; 
sA = sB + sC; 

這意味着「SB + SC」被提升爲INT,然後分配給SA這是簽署短。 要解決這個警告,我必須像這樣施放它。

signed short sA, sB=1, sC=2; 
sA = (signed short)(sB + sC); 

此警告也出現在下面的代碼中。

signed short sA=2; 
sA += 5; 

而且可以通過刪除操作+ =這個固定...

sA = (signed short)(sA + 1); 

這是一個有點討厭,因爲我不能使用運營商+ =- =

我希望GCC根據操作數選擇正確的整數提升。我的意思是,SA = SB +的sCSA + = 5不應該被晉升爲INT因爲他們都是簽訂短期

據我所知,在默認情況下推進到INT防止溢出的錯誤,但它是一個有點惱人,因爲我要投我的大部分代碼或改變我的變量INT

我可以使用GCC選項來呈現此整數提升方案嗎?

感謝您的幫助。

+0

我沒有解決方案,但是你總是可以用'short'而不是'signed short'來完成,這可能會讓這個問題稍微有些討厭。我承認它仍然很煩人。 –

回答

2

這不是gcc,這是標準的C語義。

每6.3.1.1:2,對象或表達的整數類型,其整數轉換秩是小於 或等於INT的秩和unsigned int轉換爲intunsigned int取決於是否帶符號該類型在參與算術表達式之前。

C以這種方式運行的原因是爲了允許在類型低於int類型的ALU操作的平臺上執行ALU操作的平臺的效率低於完整的int類型。您應該對int值執行所有算術運算,並僅將其轉換爲short以用於存儲。

+0

幾年前,我曾經與Borland C++和VIsual C++一起工作,並且我能夠使用operator + =而沒有任何警告。我知道GCC嚴格支持C規則,但我從來沒有見過。它很煩人。感謝您的回覆。 –

相關問題