【问题标题】:Warning - Integer operation result is out of range in c警告 - 整数运算结果超出 c 的范围
【发布时间】:2013-08-06 13:11:30
【问题描述】:

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

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

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

我想了解如何更改以避免警告。

提前感谢您!

【问题讨论】:

  • 您应该考虑先初始​​化regVal 或仅使用= 运算符而不是|= 运算符来分配它。
  • @patrickvacek 虽然这当然是一个有效的观点,但我认为这不是这个问题的重点。
  • 我不熟悉那个编译器,但通常,该变量将采用随机值,它不会被初始化为 0。将您的 |= 更改为 = 以避免。
  • @DrewMcGowen,我知道,这就是为什么它是评论而不是答案。它的目的是提供友好的建议。

标签: c gcc


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    编译器溢出警告是正确的,因为表达式 1

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多