Aviso do compilador (níveis 3 e 4) C4244
conversão 'conversion' de 'type1' para 'type2', possível perda de dados
Um tipo inteiro é convertido em um tipo inteiro menor.
- Este é um aviso de nível 4 se type1 for assinado ou não assinado
int
e type2 for menor, como um signed ou unsignedshort
. - É um aviso de nível 3 se um valor do tipo
__int64
ouunsigned __int64
for atribuído a um .int
Uma possível perda de dados pode ter ocorrido devido a uma conversão de restrição, o que pode levar a resultados inesperados.
Para corrigir esse aviso, altere seu programa para usar tipos compatíveis ou adicione lógica que garanta que o intervalo de valores possíveis seja compatível com os tipos que você está usando. Se a conversão for pretendida, use uma conversão explícita para silenciar o aviso.
C4244 também pode aparecer quando o nível de aviso é 2. Para obter mais informações, consulte Aviso do compilador (nível 2) C4244.
O seguinte exemplo gera o aviso 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
}
Para obter mais informações, confira Conversões aritméticas usuais.
Para obter mais informações sobre como definir o nível de aviso no Visual Studio, consulte Para definir as opções do compilador no ambiente de desenvolvimento do 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
}
O aviso C4244 pode ocorrer ao criar código para destinos de 64 bits que não gera o aviso ao criar destinos de 32 bits. Por exemplo, a aritmética do ponteiro resulta em uma quantidade de 32 bits em plataformas de 32 bits, mas uma quantidade de 64 bits em plataformas de 64 bits.
O seguinte exemplo gera o erro C4244 quando compilado para destinos de 64 bits:
// C4244_level3_b.cpp
// compile with: /W3
int main() {
char* p1 = 0;
char* p2 = 0;
int x = p2 - p1; // C4244
}