Condividi tramite


Avviso C6297

Overflow aritmetico: il valore a 32 bit viene spostato, quindi viene eseguito il cast a un valore a 64 bit. Il risultato potrebbe non essere un valore previsto

Osservazioni:

Questo avviso indica un comportamento errato risultante da regole di promozione integrali e tipi maggiori di quelli in cui viene in genere eseguita l'aritmetica.

In questo caso, un valore a 32 bit è stato spostato a sinistra e il risultato di tale spostamento è stato eseguito il cast a un valore a 64 bit. Se lo spostamento ha superato l'overflow del valore a 32 bit, i bit vengono persi.

Se non si vogliono perdere bit, eseguire il cast del valore per passare a una quantità a 64 bit prima che venga spostata. Se si desidera perdere bit, eseguire il cast appropriato a unsigned long o a un short tipo. In alternativa, mascherare il risultato del turno. Entrambi gli approcci eliminano questo avviso e rendono più chiara la finalità del codice.

Nome dell'analisi del codice: RESULTOFSHIFTCASTTOLARGERSIZE

Esempio

Il codice seguente genera questo avviso:

void f(int i)
{
  unsigned __int64 x;

  x = i << 34;
  // code
}

Per correggere questo avviso, usare il codice seguente:

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

Vedi anche

Avviso del compilatore (livello 1) C4293