2014-04-26 50 views
2

在gcc中,對小於int的整數類型加上或減去一個常數會得到一個int爲什麼向int8_t添加一個常量會將它提升爲更大的類型?

#include <cstdint> 
#include <cstdio> 

int main() 
{ 
    int8_t wat = 5; 
    printf("%zd\n", sizeof(wat + 1)); 
    return 0; 
} 

給我4.使用帶有-Wconversion簡單+=語句時注意到這一點。與警告標誌設置,

#include <cstdint> 

int main() 
{ 
    int8_t wat = 5; 
    wat += 5; 
    return 0; 
} 

給出

wat.cpp:7:6:警告:轉換從 'INT' '{中int8_t又名符號字符}' 可以改變其值[ - Wconversion]

有什麼辦法可以抑制這個警告?爲什麼會發生這種情況?鑄造似乎沒有辦法。

+1

鏘不會在這種情況下發出警告...... –

+0

並非所有的整數都是'int's。 。 – user2864740

+1

不僅僅在GCC中。該標準將其定義爲整體推廣。 – chris

回答

1

根據該期望的算術或 枚舉類型原因的轉化率和產率結果類型的操作數以類似的方式 C++標準

10許多二進制運算符。 的目的是產生一個共同的類型,這也是 結果的類型。這種模式被稱爲通常的算術轉換,

正常的算術轉換包括整數提升

1比BOOL,char16_t,char32_t,或 wchar_t的其整轉換以外的整數類型的prvalue rank(4.13)小於 的等級int可以被轉換爲int類型的prvalue,如果int可以表示所有源類型的值 ;否則,源prvalue可以被 轉換爲unsigned int類型的prvalue。因此,在這個表達式

wat += 5; 

,它等效於

wat = wat + 5; 

在分配的右側wat

轉換爲類型int和表達wat + 5的類型是int。由於int類型的值的範圍大於類型int8_t,編譯器會發出警告。

同樣警告的消息顯示如何抑制警告:[-Wconversion]

相關問題