我正在使用RVCT编译器在C中编译此代码(此处为相关部分):
static void Test (void)
{
unsigned long regVal;
regVal |= (UINT32)( (0x1 << 31) |
(0x1 << 26) |
0x3E);
}
编译代码时,我收到以下警告警告: “#61-D:整数运算结果超出范围”。
我想知道要改变什么以避免警告。
提前谢谢!
答案 0 :(得分:7)
由于整数提升规则,内部表达式(即在(UINT32)
强制转换之前)被视为signed int
。因此,0x1 << 31
为0x80000000
,这是一个负的有符号整数,从而产生警告。要修复,可以通过将“U”附加到十六进制常量来强制移位无符号,例如0x1U
。
regVal |= (UINT32)( (0x1U << 31) |
(0x1U << 26) |
0x3EU);
这将强制所有的移位和按位OR无符号,这应该消除警告(并且还消除了对(UINT32)
强制转换的需要,因为它已经是未签名的。)
答案 1 :(得分:1)
编译器溢出警告是正确的,因为表达式1&lt;&lt; 31表示带符号的int。要避免警告,请使用U postfix将常量0x1显式定义为无符号值。例如:
unsigned long regVal;
regVal |= (UINT32)( (0x1U << 31) |
(0x1 << 26) |
0x3E);