Freigeben über


Compilerwarnung (Ebenen 3 und 4) C4244

'conversion': Umwandlung von 'type1' in 'type2', Datenverlust ist möglich

Bemerkungen

Ein ganzzahliger Typ wird in einen kleineren ganzzahligen Typ konvertiert.

  • Dies ist eine Warnung der Ebene 4, wenn Typ1 ein signiertes oder nicht signiertes int ist und Typ2 kleiner ist, z. B. ein signiertes oder nicht signiertes short.
  • Es handelt sich um eine Warnung der Ebene 3, wenn ein Wert vom Typ __int64 oder unsigned __int64 einem signierten oder nicht signierten intWert zugewiesen ist. Möglicherweise ist ein möglicher Datenverlust aufgrund einer schmalen Konvertierung aufgetreten, was zu unerwarteten Ergebnissen führen kann.

Um diese Warnung zu beheben, ändern Sie entweder Ihr Programm so, dass kompatible Typen verwendet werden, oder fügen Sie Logik hinzu, die sicherstellt, dass der Bereich möglicher Werte mit den verwendeten Typen kompatibel ist. Wenn die Konvertierung beabsichtigt ist, verwenden Sie eine explizite Umwandlung, um die Warnung zu stillen.

C4244 kann auch angezeigt werden, wenn die Warnstufe 2 ist. Weitere Informationen finden Sie unter Compilerwarnung (Ebene 2) C4244.

Examples

Im folgenden Beispiel wird C4244 generiert:

// C4244_level4.cpp
// compile with: /W4
void test(unsigned short num) {}

int main() {
   int int1 = 1;
   unsigned int uint1 = 2;

   short short1 = int1;   // C4244
   short short2 = (short)int1;   // warning silenced - explicit cast

   short short3 = uint1;   // C4244
   unsigned short ushort = uint1; // C4244
   test(uint1);   // C4244
}

Weitere Informationen finden Sie unter "Übliche arithmetische Konvertierungen".
Weitere Informationen zum Festlegen der Warnstufe in Visual Studio finden Sie unter Festlegen der Compileroptionen in der Visual Studio-Entwicklungsumgebung

// C4244_level3.cpp
// compile with: /W3
int main() {
   __int64 i64 = 1;
   unsigned __int64 u64 = 2;

   int int1 = i64;   // C4244
   int int3 = u64;   // C4244
}

Warnung C4244 kann beim Erstellen von Code für 64-Bit-Ziele auftreten, die beim Erstellen von 32-Bit-Zielen keine Warnung generieren. Beispielsweise führt die Zeigerarithmetik zu einer 32-Bit-Menge auf 32-Bit-Plattformen, aber einer 64-Bit-Menge auf 64-Bit-Plattformen.

Im folgenden Beispiel wird C4244 beim Kompilieren für 64-Bit-Ziele generiert:

// C4244_level3_b.cpp
// compile with: /W3
int main() {
   char* p1 = 0;
   char* p2 = 0;
   int x = p2 - p1;   // C4244
}