Compartilhar via


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 unsigned short.
  • É um aviso de nível 3 se um valor do tipo __int64 ou unsigned __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
}