Udostępnij za pośrednictwem


Ostrzeżenie kompilatora (poziomy 3 i 4) C4244

Konwersja "konwersja" z "type1" na "type2", możliwa utrata danych

Typ liczby całkowitej jest konwertowany na mniejszy typ całkowity.

  • Jest to ostrzeżenie poziomu 4, jeśli typ1 jest podpisany lub niepodpisany int , a typ2 jest mniejszy, taki jak podpisany lub niepodpisany short.
  • Jest to ostrzeżenie poziomu 3, jeśli wartość typu __int64 lub unsigned __int64 jest przypisana do podpisanego lub niepodpisanego int. Mogła wystąpić możliwa utrata danych z powodu konwersji zawężającej, co może prowadzić do nieoczekiwanych wyników.

Aby naprawić to ostrzeżenie, zmień program tak, aby używał zgodnych typów lub dodaj logikę, która gwarantuje, że zakres możliwych wartości jest zgodny z używanymi typami. Jeśli konwersja jest przeznaczona, użyj jawnego rzutowania, aby wyciszyć ostrzeżenie.

C4244 może również pojawić się, gdy poziom ostrzeżenia wynosi 2. Aby uzyskać więcej informacji, zobacz Ostrzeżenie kompilatora (poziom 2) C4244.

Poniższy przykład generuje C4244:

// 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
}

Aby uzyskać więcej informacji, zobacz Zwykłe konwersje arytmetyczne.
Aby uzyskać więcej informacji na temat ustawiania poziomu ostrzeżenia w programie Visual Studio, zobacz Aby ustawić opcje kompilatora w środowisku projektowym programu Visual Studio

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

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

Ostrzeżenie C4244 może wystąpić podczas kompilowania kodu dla obiektów docelowych 64-bitowych, które nie generują ostrzeżenia podczas kompilowania dla obiektów docelowych 32-bitowych. Na przykład arytmetyka wskaźnika skutkuje ilością 32-bitową na platformach 32-bitowych, ale 64-bitową ilością na platformach 64-bitowych.

Poniższy przykład generuje kod C4244 podczas kompilacji dla obiektów docelowych 64-bitowych:

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