Sdílet prostřednictvím


Upozornění kompilátoru (úrovně 3 a 4) C4244

'převod' z 'type1' na 'type2', možné ztráty dat

Celočíselná hodnota se převede na menší celočíselné typy.

  • Toto je upozornění úrovně 4, pokud je type1 znaménkem nebo bez znaménka int a type2 je menší, například znaménkem nebo bez znaménka short.
  • Je to upozornění úrovně 3, pokud je hodnota typu __int64 nebo unsigned __int64 je přiřazena k podepsanému nebo nepodepsanému int. K možné ztrátě dat mohlo dojít kvůli zužujícímu převodu, což může vést k neočekávaným výsledkům.

Pokud chcete toto upozornění opravit, změňte program tak, aby používal kompatibilní typy, nebo přidejte logiku, která zajišťuje, že rozsah možných hodnot je kompatibilní s typy, které používáte. Pokud je převod zamýšlen, pomocí explicitního přetypování upozorňujte.

C4244 se může zobrazit také v případech, kdy je úroveň upozornění 2. Další informace naleznete v tématu Upozornění kompilátoru (úroveň 2) C4244.

Následující ukázka vygeneruje 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
}

Další informace naleznete v tématu Obvyklé Aritmetické převody.
Další informace o nastavení úrovně upozornění v sadě Visual Studio naleznete v tématu Nastavení možností kompilátoru ve vývojovém prostředí sady 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
}

Upozornění C4244 může nastat při vytváření kódu pro 64bitové cíle, které negenerují upozornění při sestavování 32bitových cílů. Například aritmetika ukazatele vede k 32bitovému množství na 32bitových platformách, ale 64bitové množství na 64bitových platformách.

Následující ukázka generuje C4244 při kompilaci pro 64bitové cíle:

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