コンパイラの警告 (レベル 3 および 4) C4244
'conversion': 'type1' から 'type2' に変換しました。データが失われている可能性があります。
整数型が、より小さい整数の型に変換されています。
- これは、 type1 が符号付きまたは符号なし
int
で、 type2 が符号付きまたは符号なしshort
などの小さい場合のレベル 4 の警告です。 __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
}