Compiler Warning (levels 3 and 4) C4244
'conversion' conversion from 'type1' to 'type2', possible loss of data
An integer type is converted to a smaller integer type.
- This is a level-4 warning if type1 is a signed or unsigned
int
and type2 is a smaller, such as a signed or unsignedshort
. - It's a level 3 warning if a value of type
__int64
orunsigned __int64
is assigned to a signed or unsignedint
. A possible loss of data may have occurred due to a narrowing conversion, which might lead to unexpected results.
To fix this warning, either change your program to use compatible types, or add logic that ensures that the range of possible values is compatible with the types you're using. If the conversion is intended, use an explicit cast to silence the warning.
C4244 can also appear when the warning level is 2. For more information, see Compiler Warning (level 2) C4244.
The following sample generates 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
}
For more information, see Usual Arithmetic Conversions.
For more information about setting the warning level in Visual Studio, see To set the compiler options in the Visual Studio development environment
// C4244_level3.cpp
// compile with: /W3
int main() {
__int64 i64 = 1;
unsigned __int64 u64 = 2;
int int1 = i64; // C4244
int int3 = u64; // C4244
}
Warning C4244 can occur when building code for 64-bit targets that doesn't generate the warning when building for 32-bit targets. For example, pointer arithmetic results in a 32-bit quantity on 32-bit platforms, but a 64-bit quantity on 64-bit platforms.
The following sample generates C4244 when compiled for 64-bit targets:
// C4244_level3_b.cpp
// compile with: /W3
int main() {
char* p1 = 0;
char* p2 = 0;
int x = p2 - p1; // C4244
}