2013-08-06 19 views
7

我使用RVCT編譯器來編譯用C代碼(相關部分在這裏):警告 - 整數運算結果超出範圍在C

static void Test (void) 
{ 
    unsigned long regVal; 
    regVal |= (UINT32)( (0x1 << 31)  | 
          (0x1 << 26)  | 
          0x3E); 
} 

當編譯代碼時,我收到以下警告警告: 「#61-D:整數運算結果超出範圍」。

我想了解如何改變以避免警告。

預先感謝您!

+2

您應該考慮首先初始化'regVal',或者僅用'='運算符而不是'| ='運算符來賦值。 – patrickvacek

+1

@patrickvacek雖然這當然是一個有效的點,我不認爲這是這個問題的主要觀點。 –

+0

我對編譯器並不熟悉,但通常情況下,該變量將採用隨機值,它不會被初始化爲0. 將您的| =改爲=以避免。 – oyvind

回答

7

由於整數提升規則,內部表達式(即在(UINT32)轉換之前)被視爲signed int。因此,0x1 << 310x80000000,這是一個負號有符號整數,從而導致警告。要解決這個問題,你可以通過在十六進制常量處加上'U'來強制這些移位無符號,如0x1U

regVal |= (UINT32)( (0x1U << 31)  | 
         (0x1U << 26)  | 
         0x3EU); 

這將迫使所有的變化和按位OR的是無符號的,這應該擺脫的警告(也消除了對(UINT32)投的需要,因爲它已經是無符號)。

+0

謝謝。添加U解決了這個問題 –

2

編譯器溢出警告是正確的,因爲表達式1表示一個signed int。要避免警告,請使用U後綴將常量0x1顯式定義爲無符號值。例如:

unsigned long regVal; 
regVal |= (UINT32)( (0x1U << 31)  | 
         (0x1 << 26)  | 
         0x3E);