C6297

Aviso C6297: estouro aritmético: valor de 32 bits é deslocado, em seguida, converter para o valor de 64 bits.Resultado não pode ser um valor esperado

Este aviso indica um comportamento incorreto que resulta da regras de promoção integral e tipos maiores do que aqueles em que a aritmética é normalmente realizada.

Nesse caso, um valor de 32 bits foi deslocado para a esquerda e o resultado dessa mudança foi convertido para um valor de 64 bits.Se a mudança estourou o valor de 32 bits, os bits são perdidas.

Se não quiser perder bits, converta o valor que possam ser transferidos para uma quantidade de 64 bits antes de ele é deslocado.Se você quiser perder bits, executando a conversão apropriada para unsigned long ou de um tipo de curto ou o resultado do turno de mascaramento será eliminar esse aviso e tornar a intenção do código mais nítido.

Exemplo

O código a seguir gera este aviso:

void f(int i)
{
  unsigned __int64 x;

  x = i << 34;
  // code 
}

Para corrigir esse aviso, use o código a seguir:

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

Consulte também

Referência

C4293 de aviso (nível 1) do compilador