我正在使用 RVCT 编译器在 C 中编译此代码(此处为相关部分):
static void Test (void)
{
unsigned long regVal;
regVal |= (UINT32)( (0x1 << 31) |
(0x1 << 26) |
0x3E);
}
编译代码时,收到如下警告Warning: “#61-D:整数运算结果超出范围”。
我想了解要更改什么以避免警告。
提前致谢!
最佳答案
由于整数提升规则,内部表达式(即在 (UINT32)
转换之前)被视为 signed int
.因此,0x1 << 31
是0x80000000
,这是一个带符号的负整数,因此会导致警告。要修复,您可以通过将“U”附加到十六进制常量来强制转换为无符号,例如 0x1U
.
regVal |= (UINT32)( (0x1U << 31) |
(0x1U << 26) |
0x3EU);
这将强制所有移位和按位或运算为无符号,这应该会消除警告(并且也不需要 (UINT32)
转换,因为它已经无符号)。
关于c - 警告 - 整数运算结果在 c 中超出范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18081203/