Advertencia del compilador (niveles 3 y 4) C4244

'conversion': conversión de 'type1' a 'type2', posible pérdida de datos

Un tipo de entero se convierte en un tipo de entero más pequeño.

  • Se trata de una advertencia de nivel 4 si type1 es un signo o unsigned int y type2 es un valor más pequeño, como un signo o unsigned short.
  • Se trata de una advertencia de nivel 3 si se asigna un valor de tipo __int64 o unsigned __int64 a un signo o sin intsigno. Es posible que se haya producido una posible pérdida de datos debido a una conversión de restricción, lo que podría provocar resultados inesperados.

Para corregir esta advertencia, cambie el programa para usar tipos compatibles o agregue lógica que garantice que el intervalo de valores posibles sea compatible con los tipos que usa. Si la conversión está pensada, use una conversión explícita para silenciar la advertencia.

C4244 también puede aparecer cuando el nivel de advertencia es 2. Para obtener más información, vea Advertencia del compilador (nivel 2) C4244.

El siguiente ejemplo genera 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 obtener más información, vea Conversiones aritméticas usuales.
Para obtener más información sobre cómo establecer el nivel de advertencia en Visual Studio, vea Para establecer las opciones del compilador en el entorno de desarrollo de 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
}

Advertencia C4244 puede producirse al compilar código para destinos de 64 bits que no generan la advertencia al compilar destinos de 32 bits. Por ejemplo, la aritmética de puntero da como resultado una cantidad de 32 bits en plataformas de 32 bits, pero una cantidad de 64 bits en plataformas de 64 bits.

En el ejemplo siguiente se genera C4244 cuando se compila 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
}