警告 - 整数运算结果超出c的范围

dea*_*zvi 6 c gcc

我正在使用RVCT编译器在C中编译此代码(此处的相关部分):

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

编译代码时,我收到以下警告警告:"#61-D:整数运算结果超出范围".

我想了解要改变什么以避免警告.

先感谢您!

Dre*_*wen 8

由于整数提升规则,内部表达式(即在强制转换之前(UINT32))被视为signed int.因此,0x1 << 310x80000000一个负的有符号整数,从而导致警告.要修复,可以通过在十六进制常量上附加"U"来强制转换为无符号,例如0x1U.

 regVal |= (UINT32)(    (0x1U << 31)     |
                        (0x1U << 26)     |
                         0x3EU);
Run Code Online (Sandbox Code Playgroud)

这将强制所有的移位和按位OR为无符号,这应该消除警告(并且还消除了对转换的需要(UINT32),因为它已经是无符号的).