コンパイラの警告 (レベル 3 および 4) C4244

'conversion': 'type1' から 'type2' に変換しました。データが失われている可能性があります。

整数型が、より小さい整数の型に変換されています。

  • type1 が符号付きまたは符号なしで、type2 が符号付きまたは符号なしintなどの小さい場合、これはレベル 4 のshort警告です。
  • __int64 の値、または符号付きまたは unsigned __int64 符号なし intに割り当てられている場合は、レベル 3 の警告です。 縮小変換が原因でデータが失われた可能性があり、予期しない結果が生じる可能性があります。

この警告を修正するには、互換性のある型を使用するようにプログラムを変更するか、使用可能な値の範囲が使用している型と互換性があることを確認するロジックを追加します。 変換が意図されている場合は、明示的なキャストを使用して警告を無音にしてください。

C4244 は、警告レベルが 2 の場合にも表示されます。 詳細については、「コンパイラの警告 (レベル 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
}

警告 C4244 は、32 ビット ターゲットのビルド時に警告を生成しない 64 ビット ターゲットのコードをビルドするときに発生する可能性があります。 たとえば、ポインターの算術演算では、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
}