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énkashort
. - Je to upozornění úrovně 3, pokud je hodnota typu
__int64
nebounsigned __int64
je přiřazena k podepsanému nebo nepodepsanémuint
. 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
}