繁体   English   中英

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

[英]Warning - Integer operation result is out of range in c

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

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

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

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

先感谢您!

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM