6

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

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

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

我想了解要更改什么以避免警告。

先感谢您!

4

2 回答 2

8

由于整数提升规则,内部表达式(即在转换之前(UINT32))被视为signed int. 因此,0x1 << 31is 0x80000000,它是一个负符号整数,从而导致警告。要解决此问题,您可以通过将“U”附加到十六进制常量来强制移位无符号,例如0x1U.

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

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

于 2013-08-06T13:15:17.377 回答
1

编译器溢出警告是正确的,因为表达式 1<<31 表示有符号整数。为避免警告,请使用 U 后缀将常量 0x1 显式定义为无符号值。例如:

unsigned long regVal;
regVal |= (UINT32)(    (0x1U << 31)     |
                        (0x1 << 26)     |
                         0x3E);
于 2013-08-06T13:15:43.603 回答