Advertencia del compilador (niveles 3 y 4) C4244Compiler Warning (levels 3 and 4) C4244

'conversion': conversión de 'type1' a 'type2', posible pérdida de datos'conversion' conversion from 'type1' to 'type2', possible loss of data

Un tipo de entero se convierte en un tipo de entero más pequeño.An integer type is converted to a smaller integer type. Se trata de una advertencia de nivel 4 Si Type1 es int y tipo2 es menor que int .This is a level-4 warning if type1 is int and type2 is smaller than int. De lo contrario, es de nivel 3 (se le asigna un valor de tipo __int64 a una variable de tipo unsigned int ).Otherwise, it is a level 3 (assigned a value of type __int64 to a variable of type unsigned int). Se ha producido una posible pérdida de datos.A possible loss of data may have occurred.

Si recibe el error C4244, debe cambiar el programa para que use tipos compatibles o agregar lógica al código, para asegurarse de que el intervalo de valores posibles sea siempre compatible con los tipos que usa.If you get C4244, you should either change your program to use compatible types, or add some logic to your code, to ensure that the range of possible values will always be compatible with the types you are using.

C4244 también se puede activar en el nivel 2; vea Advertencia del compilador (nivel 2) C4244 para obtener más información.C4244 can also fire at level 2; see Compiler Warning (level 2) C4244 for more information.

Puede que la conversión tenga problemas debido a conversiones implícitas.The conversion may have a problem due to implicit conversions.

El siguiente ejemplo genera C4244:The following sample generates C4244:

// C4244_level4.cpp
// compile with: /W4
int aa;
unsigned short bb;
int main() {
   int b = 0, c = 0;
   short a = b + c;   // C4244

   bb += c;   // C4244
   bb = bb + c;   // C4244
   bb += (unsigned short)aa;   // C4244
   bb = bb + (unsigned short)aa;   // OK
}

Para obtener más información, vea conversiones aritméticas habituales.For more information, see Usual Arithmetic Conversions.

// C4244_level3.cpp
// compile with: /W3
int main() {
   __int64 i = 8;
   unsigned int ii = i;   // C4244
}

La advertencia C4244 puede producirse al generar código para destinos de 64 bits que no genera la advertencia al compilar destinos de 32 bits.Warning C4244 can occur when building code for 64-bit targets that does not generate the warning when building for 32-bit targets. Por ejemplo, una diferencia entre punteros es una cantidad de 32 bits en plataformas de 32 bits, pero una cantidad de 64 bits en plataformas de 64 bits.For example, a difference between pointers is a 32-bit quantity on 32-bit platforms, but a 64-bit quantity on 64-bit platforms.

En el ejemplo siguiente se genera C4244 cuando se compila para destinos de 64 bits:The following sample generates C4244 when compiled for 64-bit targets:

// C4244_level3_b.cpp
// compile with: /W3
int main() {
   char* p1 = 0;
   char* p2 = 0;
   int x = p2 - p1;   // C4244
}