Freigeben über


C6297

Warnung C6297: Arithmetischer Überlauf: Der 32-Bit-Wert wird verschoben und dann in einen 64-Bit-Wert umgewandelt.Die Ergebnisse entsprechen möglicherweise nicht dem erwarteten Wert.

Diese Warnung deutet auf ein fehlerhaftes Verhalten hin, das sich daraus ergibt, dass integrale Erweiterungsregeln und -typen größer sind als die, in denen Arithmetik normalerweise durchgeführt wird.

In diesem Fall wurde ein 32-Bit-Wert nach links verschoben, und das Ergebnis der Verschiebung war die Umwandlung in einen 64-Bit-Wert.Wenn die Verschiebung einen Überlauf des 32-Bit-Werts verursacht, gehen Bits verloren.

Wenn keine Bits verloren gehen sollen, wandeln Sie den zu verschiebenden Wert vor der Verschiebung in einen Wert mit 64 Bits um.Wenn Bits verloren gehen sollen, wird durch Durchführen der entsprechenden Umwandlung in einen Wert vom Typ unsigned long oder short oder durch Maskieren des Ergebnisses der Umwandlung diese Warnung nicht mehr angezeigt und die Absicht des Codes deutlicher dargestellt.

Beispiel

Der folgende Code generiert diese Warnung:

void f(int i)
{
  unsigned __int64 x;

  x = i << 34;
  // code 
}

So korrigieren Sie die Warnung unter Verwendung des folgenden Codes

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

Siehe auch

Referenz

Compilerwarnung (Stufe 1) C4293