Avertissement du compilateur (niveaux 3 et 4) C4244
'conversion' : conversion de 'type1' en 'type2', perte possible de données
Un type entier est converti en type entier plus petit.
- Il s’agit d’un avertissement de niveau 4 si type1 est signé ou non signé
int
et que type2 est plus petit, tel qu’un signé ou non signéshort
. - Il s’agit d’un avertissement de niveau 3 si une valeur de type
__int64
ouunsigned __int64
est affectée à un signé ou non signéint
. Une perte possible de données peut avoir eu lieu en raison d’une conversion étroite, ce qui peut entraîner des résultats inattendus.
Pour corriger cet avertissement, modifiez votre programme pour utiliser des types compatibles ou ajoutez une logique qui garantit que la plage de valeurs possibles est compatible avec les types que vous utilisez. Si la conversion est prévue, utilisez un cast explicite pour réduire l’avertissement en silence.
C4244 peut également apparaître lorsque le niveau d’avertissement est 2. Pour plus d’informations, consultez Avertissement du compilateur (niveau 2) C4244.
L'exemple suivant génère l'avertissement 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
}
Pour plus d’informations, consultez Conversions arithmétiques habituelles.
Pour plus d’informations sur la définition du niveau d’avertissement dans Visual Studio, consultez Pour définir les options du compilateur dans l’environnement de développement 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
}
L’avertissement C4244 peut se produire lors de la génération de code pour des cibles 64 bits qui ne génèrent pas l’avertissement lors de la génération de cibles 32 bits. Par exemple, l’arithmétique pointeur entraîne une quantité 32 bits sur les plateformes 32 bits, mais une quantité 64 bits sur les plateformes 64 bits.
L'exemple suivant génère l'avertissement C4244 lors de la compilation pour des cibles 64 bits :
// C4244_level3_b.cpp
// compile with: /W3
int main() {
char* p1 = 0;
char* p2 = 0;
int x = p2 - p1; // C4244
}