Condividi tramite


Avviso del compilatore (livelli 3 e 4) C4244

'conversion': conversione da 'type1' a 'type2'. Possibile perdita di dati

Un tipo integer viene convertito in un tipo integer di dimensioni minori.

  • Si tratta di un avviso di livello 4 se type1 è un segno o unsigned int e type2 è più piccolo, ad esempio un segno o unsigned short.
  • Si tratta di un avviso di livello 3 se un valore di tipo __int64 o unsigned __int64 viene assegnato a un oggetto con segno o senza segno int. È possibile che si sia verificata una possibile perdita di dati a causa di una conversione di tipo narrowing, che potrebbe causare risultati imprevisti.

Per correggere questo avviso, modificare il programma in modo da usare tipi compatibili o aggiungere logica che garantisce che l'intervallo di valori possibili sia compatibile con i tipi in uso. Se la conversione è prevista, usare un cast esplicito per disattivare l'avviso.

C4244 può essere visualizzato anche quando il livello di avviso è 2. Per altre informazioni, vedere Avviso del compilatore (livello 2) C4244.

L'esempio seguente genera l'errore 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
}

Per altre informazioni, vedere Conversioni aritmetiche consuete.
Per altre informazioni sull'impostazione del livello di avviso in Visual Studio, vedere Per impostare le opzioni del compilatore nell'ambiente di sviluppo di 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'avviso C4244 può verificarsi quando si compila codice per destinazioni a 64 bit che non genera l'avviso durante la compilazione per le destinazioni a 32 bit. Ad esempio, l'aritmetica del puntatore genera una quantità a 32 bit su piattaforme a 32 bit, ma una quantità a 64 bit su piattaforme a 64 bit.

L'esempio seguente genera l'errore C4244 quando viene compilato per destinazioni a 64 bit:

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