共用方式為


編譯器警告 (層級 3 和 4) C4244

'conversion':將 'type1' 轉換為 'type2',資料可能遺失

整數類型會轉換為較小的整數類型。

  • 如果 type1 是帶正負號或未帶正負 int 號,且 type2 為較小的層級 4 警告,例如帶正負號或未帶正負號 short的 。
  • 如果類型 __int64 為 或 unsigned __int64 的值指派給帶正負號或未帶正負 int號的 ,則為層級 3 警告。 由於轉換縮小,可能會遺失數據,這可能會導致非預期的結果。

若要修正此警告,請將程式變更為使用相容的類型,或新增邏輯,以確保可能的值範圍與您所使用的類型相容。 如果打算轉換,請使用明確轉換來讓警告無聲。

當警告層級為 2 時,也會顯示 C4244。 如需詳細資訊,請參閱 編譯程式警告(層級 2) C4244

下列範例會產生 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
}

如需詳細資訊,請參閱 一般算術轉換
如需在Visual Studio中設定警告層級的詳細資訊,請參閱 在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
}

針對建置 32 位目標時不會產生警告的 64 位目標代碼時,可能會發生警告 C4244。 例如,指標算術會導致 32 位平臺上的 32 位數量,但在 64 位平臺上產生 64 位的數量。

下列範例會在進行 64 位元目標的編譯時產生 C4244:

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