Bagikan melalui


Compiler Warning (level 3 dan 4) C4244

Konversi 'konversi' dari 'type1' ke 'type2', kemungkinan hilangnya data

Jenis bilangan bulat dikonversi ke jenis bilangan bulat yang lebih kecil.

  • Ini adalah peringatan tingkat-4 jika type1 adalah ditandatangani atau tidak ditandatangani int dan type2 lebih kecil, seperti yang ditandatangani atau tidak ditandatangani short.
  • Ini adalah peringatan tingkat 3 jika nilai jenis __int64 atau unsigned __int64 ditetapkan ke yang ditandatangani atau tidak ditandatangani int. Kemungkinan hilangnya data mungkin terjadi karena konversi yang menyempit, yang mungkin menyebabkan hasil yang tidak terduga.

Untuk memperbaiki peringatan ini, ubah program Anda untuk menggunakan jenis yang kompatibel, atau tambahkan logika yang memastikan bahwa rentang nilai yang mungkin kompatibel dengan jenis yang Anda gunakan. Jika konversi dimaksudkan, gunakan cast eksplisit untuk membungkam peringatan.

C4244 juga dapat muncul ketika tingkat peringatan adalah 2. Untuk informasi selengkapnya, lihat Compiler Warning (level 2) C4244.

Sampel berikut menghasilkan 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
}

Untuk informasi selengkapnya, lihat Konversi Aritmatika Biasa.
Untuk informasi selengkapnya tentang mengatur tingkat peringatan di Visual Studio, lihat Untuk mengatur opsi pengkompilasi di lingkungan pengembangan 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
}

Peringatan C4244 dapat terjadi ketika membangun kode untuk target 64-bit yang tidak menghasilkan peringatan saat membangun target 32-bit. Misalnya, aritmatika pointer menghasilkan kuantitas 32-bit pada platform 32-bit, tetapi kuantitas 64-bit pada platform 64-bit.

Sampel berikut menghasilkan C4244 saat dikompilasi untuk target 64-bit:

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