C6297

警告 C6297:算术溢出: 对 32 位值进行移位操作,然后强制转换为 64 位值。 可能得到非预期的结果值

此警告意味着整数提升规则产生了错误的行为以及类型大于通常在其中执行算术运算的类型。

在这种情况下,会将 32 位值左移,其结果是值强制转换为 64 位值。 如果移位使 32 位值溢出,则会丢失位。

如果不希望丢失位,请在对值进行移位之前,先将它强制转换为 64 位数。 如果您希望丢失位,请执行适当的强制转换以转换为无符号的 long 或 short 类型,或者屏蔽移位的结果以消除此警告并使代码的目的更明确。

示例

下面的代码生成此警告:

void f(int i)
{
  unsigned __int64 x;

  x = i << 34;
  // code 
}

若要更正此警告,请使用下面的代码:

void f(int i)
{
  unsigned __int64 x;
  // code
  x = ((unsigned __int64)i) << 34;
}

请参见

参考

编译器警告(等级 1)C4293