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

标签 c gcc

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

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

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

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

提前致谢!

最佳答案

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

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

这将强制所有移位和按位或运算为无符号,这应该会消除警告(并且也不需要 (UINT32) 转换,因为它已经无符号)。

关于c - 警告 - 整数运算结果在 c 中超出范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18081203/

相关文章:

c++ - 识别自动生成的成员函数

ruby - 检查 C 编译器是否工作...不

c - 我想为我自己的 Linux 内核工作文件夹生成交叉引用

gcc - 加载SSE寄存器

C 程序 - 不同机器上的不同行为。内存分配问题?

c - 爱特梅尔工作室7 : unrecognized option `-mrelax'

c - 是否可以访问文件中的特定字符串

保存函数指针的容器

c - 如何防止 gcc 预处理器删除行继续符?

c - 在 C 中使用 getchar() 将输入发送到 char 数组